我对指向数组的指针和普通指针以及如何访问有点困惑。 我试过这个...
int *ptr1, i;
int (*ptr2)[3];
int myArray[3] = {1, 1, 1};
int myArray1[5] = {1, 1, 1, 1, 1};
ptr1 = myArray;
ptr2 = myArray1;// compiles fine even though myArray1 contains 5 elements
// and ptr2 is pointing to array of 3 elements.
printf("%d",ptr2[3]); // prints some garbage.
为什么这个语句打印垃圾?正确的说法是什么? 谁能解释一下?
最佳答案
我们也可以将指向数组的指针声明为
int (*ptr)[]; // ptr is a pointer to array.
当你这样做的时候
ptr2 = myArray1;
编译器会抛给你一条警告信息。 Look boss 类型不兼容。
在某些情况下,数组会退化为指针。警告消息是因为,当数组衰减为指针时,衰减的类型是指针。在这种情况下,当您这样做时
ptr1 = myArray;
myArray 衰减为 int *
。
但是当你这样做的时候,
ptr2 = myArray1;
myArray1
衰减为int *
的指针,但是ptr2
的类型是int (*)[]
.
为了避免警告,你应该说
ptr2 = &myArray1; //&myArray1 returns address of array and type is int(*)[].
为什么这个语句打印垃圾?正确的说法是什么?谁能解释一下?
printf("%d",ptr2[3]);// prints some garbage.
是的,但是为什么呢?先看正确的说法……(注意index要小于3)
printf("myArray1[%d] = %d\n", i, (*ptr2)[2]);
我们必须使用(*ptr2)[i]
来打印数组元素。这是因为,仅通过提及 ptr2
,我们将获得数组的地址(而不是某些 int
的地址)。并通过取消引用它 (*ptr2)
我们将获得数组的 第 0 个元素
的地址。
关于c - 指向数组的指针与普通指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19582282/