0

私はCに不慣れですが、良いCを学ぶことを決意しています。あなたの助けが必要です。配列を練習しているときに、配列要素にアクセスする方法が正しいか、それを行うためのより良い方法があるかもしれないことを知りたいと思いました。次のコードを確認し、ポインタで配列を使用する良い方法を提案してください。誰かがポインタを使った配列の事前練習のためのチュートリアルに私を案内してくれたら本当にありがたいです。

int main()
{
   unsigned int i, j;
   unsigned int arr1[] = {1,2,3,4,5,6,7,8,9};

   unsigned int * ptr_arr = (unsigned int *)malloc(sizeof(unsigned int));
   ptr_arr = arr1;

   for(i=0;i<=8;i++)
   {
         printf("Value at location %d\t is:  %d\n",i,*(ptr_arr+i));
         printf("\n");         
         printf("Value of i %d and value at %d\n",i, ptr_arr[i]);
   }

   return 0;
}  
4

4 に答える 4

4

あなたのプログラムはメモリをリークしています

unsigned int * ptr_arr = (unsigned int *)malloc(sizeof(unsigned int));

ptr_arr にメモリを割り当てる必要はありません。

arr1のアドレスの割り当てで十分です

ptr_arr = arr1;

それを使用する別の方法は、毎回ポインターをインクリメントして使用することです

    ptr_array2 = arr1
    for (int i = 0; i < 8 ; i++)
    {
       printf ("%d", *ptr_array2);
       ptr_array2++;
     }
于 2013-02-27T04:43:56.110 に答える
1

配列内の要素にアクセスする方法はどちらも有効です。ただし、読みやすくするために、array[subscript]代わりに*(arrayStart+index).

例:

int array[10] = {1,2,3,4,5,6,7,8,9,0};

配列では、要素は から始まり、連続して配置されarray(say address 0x00000000)ます。32 ビットの整数サイズを想定すると、2アドレス のアドレスに配置され、アドレス に配置されarray + 4ます0x00000004。同様に、次の要素3はアドレスarray + 8に配置され、アドレス に配置されます0x00000008

私が書くとき、実際には配列の 3 番目の要素である(または) の要素のarray[2]に 2 番目の要素が必要です。したがって、配列インデックスは から始まります。arrayarray[0]0

文字通り、array[0]= *(array + 0)array[1]= *(array + 1)array[2]=を意味します。*(array+2)

于 2013-02-27T05:01:10.430 に答える
0

あなたは1つの方法を逃しました:

     printf("Value of i %d and value at %d\n",i, i[ptr_arr]);
于 2013-02-27T04:47:55.227 に答える
0

とにかく arr のアドレスを ptr_arr に割り当てるので、ptr_arr にメモリを割り当てる必要はありません。上記のコードはメモリ リークを引き起こします。

インターネットで入手できる数多くのチュートリアルの 1 つを参照できます。参考までに、いくつかのリンクを掲載しています。

http://www.clear.rice.edu/comp221/html/pdf/03-arrays-pointers.pdf http://www.cs.utexas.edu/users/fussell/courses/cs310h/lectures/Lecture_17-310h .pdf

于 2013-02-27T04:45:41.203 に答える