c - 数组指针的自动类型转换

标签 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 并分配了 &arr 的值。如果我尝试增加 ptr2,它会按预期增加 5 个元素。 ptr3ptr4ptr5

的行为类似

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

最佳答案

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

  • &arr 是指向数组的指针,整个数组。您可以引用数据类型,以便更好地理解。 &arr 这里的类型是 int (*) [5],即指向 5 个 int 数组的指针。

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

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

建议:启用所有编译器警告,它应该告诉您哪里出了问题。

那么,根据上面的理解,

 int *ptr = &arr;

是错误的,因为它们不是兼容的类型。同样适用

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

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

关于c - 数组指针的自动类型转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40127402/

相关文章:

Code::Blocks 无法识别简单 C 程序中的双重标识符 (%lf)

php - 在数据库中获取玩家下一个排名 - Laravel 5.2

c++ - 指针初始化和分配问题

c - 从另一个结构访问一个结构的指针

c - MIPS 字符串存储

c - 将单个字符视为 char *

c - 确定 Linux 键盘事件设备

python - python中的嵌套lambda表达式map和reduce

java - 循环数组队列实现 : Which is the best way to resize a circular array?

c++ - 将类转换为该类的指针的简单情况