数组指针的自动类型转换

时间:2016-10-19 09:29:10

标签: c arrays pointers

我试图用以下程序理解指针和数组。

#include <stdio.h>

int main(void) {
    int arr[] = {1, 2, 3, 4, 5};
    int *ptr = &arr;
    int *ptr1 = arr;
    int (*ptr2)[5] = &arr;
    int (*ptr3)[5] = arr;
    int *ptr4 = &arr[0];
    int (*ptr5)[5] = &arr[0]; 
    printf("%d %d %d %d %d %d\n",*(ptr+1), *(ptr1+1), *(ptr2+1), 
            *(ptr3+1), *(ptr4+1), *(ptr5+1));
    return 0;
}

在前面的一个问题referring to arrays as pointers中,我读到arr是指向第一个元素的指针,其中&arr是指向整个数组的指针。

如果我们在ptrptr1上进行指针算法,如上面的程序所示,它们都产生相同的结果,即它们都是指向整数的指针,因为它们被分配给类型的变量int *

但是我创建了一个指向5个元素ptr2的数组的指针,并指定了&amp; arr的值。如果我尝试增加ptr2,它会按预期增加5个元素。 ptr3ptr4ptr5

的行为类似

[编辑]当我int *ptr = &arr时,指向数组的指针会自动输入到int *吗? 我可以假设&arr, arr, &arr[0]表达式实际上是相同的,因为它们产生相同的值吗?对这个值的算术实际上取决于赋值变量的类型?

2 个答案:

答案 0 :(得分:2)

嗯,不,&arrarr&arr[0]不一样。详细说明,

  • &arr是指向数组的指针,即整个数组。您可以参考数据类型,以便更好地理解。 &arr此处的类型为int (*) [5],即指向5 int s数组的指针。

  • arr是数组名称,在某些情况下,会衰减到指向数组第一个元素的指针。

  • &arr[0]是数组中第一个元素的地址,在任何情况下都可以。

建议: 启用所有编译器警告,它应该告诉您出错的地方。

所以,根据上述理解,

 int *ptr = &arr;

错误,因为它们不兼容。同样适用于

int (*ptr5)[5] = &arr[0];

因此,您尝试对这些变量执行的任何操作(及其结果,如果有的话)都没有定义。

答案 1 :(得分:0)

不,&amp; arr和arr在C中不相同,因为arr是指向arr的第一个元素的指针,而&amp; arr是指向arr本身的指针。然而,arr和&amp; arr [0]的作用相同,因为它们都指向数组的第一个元素(它们仍然不完全相同)。换句话说,您可以理解 arr和&amp; arr [0]指向4字节位置,而&amp; arr指向5x4字节位置因此它们是不同的。