17

次のコードの場合:

    int (*ptr)[10];
    int a[10]={99,1,2,3,4,5,6,7,8,9};
    ptr=&a;
    printf("%d",(*ptr)[1]);

何を印刷する必要がありますか?ここでガベージ値を期待していますが、出力は1.
(そのために、この方法でポインタ配列を初期化すると、つまり順番ptr[10]に要素を指し始めると結論付けていますa[10])。

しかし、次のコード フラグメントはどうでしょうか。

int *ptr[10];
int a[10]={0,1,2,3,4,5,6,7,8,9};
*ptr=a;
printf("%d",*ptr[1]);

セグメンテーション違反を引き起こしています。

4

6 に答える 6

19

int *ptr[10];

これは 10 個のポインターの配列であり、10 個の配列へのint*ポインターではなく、int

int (*ptr)[10];

これは、10 の配列へのポインターです。int

どちらも配列を指すことができるという点では同じだと思いますが、指定されたフォームは 10のint *ptr;配列のみを指すことができますint

于 2012-12-17T08:39:56.270 に答える
10
int (*ptr)[10];

10 個の int の配列へのポインタです。

int *ptr[10];

10 個のポインターの配列です。

セグメンテーション違反の理由:

*ptr=a; printf("%d",*ptr[1]);

aここでは、要素をptr指す配列のアドレスを割り当てていますa[0]。これは次と同等です。*ptr=&a[0];

ただし、印刷すると、ptr[1]未定義の動作である初期化されていないポインターにアクセスするため、segfault が発生します。

于 2012-12-17T08:45:57.190 に答える
4

int(*)[10]10 個のメンバーを持つ int 配列へのポインターです。つまり、 を指しint a[10]ます。

ここでint *[10]、整数ポインターの配列はそのままです

#include <stdio.h>
int main()
{

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

printf("\n%p  %p", ptr[0], a);

*ptr=a; //ptr[0] is assigned with address of array a.

printf("\n%p  %p", ptr[0], a); //gives you same address

printf("\n%d",*ptr[0]); //Prints zero. If *ptr[1] is given then *(ptr + 1) i.e ptr[1] is considered which is uninitialized one.

return 0;
}
于 2012-12-17T08:40:14.023 に答える
1

int (*p)[10] は、p がサイズ 10 の整数配列へのポインターであることを意味します。

int *p[10] は、p が 10 個の整数ポインターの配列であることを意味します。

于 2012-12-17T08:42:30.967 に答える