c - 指向数组的指针与普通指针

标签 c arrays pointers

我对指向数组的指针和普通指针以及如何访问有点困惑。 我试过这个...

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/

相关文章:

c - 删除重复值并在其位置添加 0

c - 通过引用和指针传递

c - 用 C 语言编写具有不同子进程的 WC 模拟器

c - 为什么我会收到断言失败的消息?

c - memcpy 与 strcat

arrays - 嵌套循环的复杂性

c - 为什么在windows下可以,但在linux下就不行呢?

arrays - Matlab:基于索引对矩阵中的值进行矢量化分配

c - 我想使用 memset 从字符串中删除一些字符

c - 指针和typedef结构,在C中调用函数时该怎么做