gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 23:20:52 25 4
gpt4 key购买 nike

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

#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是指向数组的指针,整个数组。您可以引用数据类型,以便更好地理解。 &arrint (*) [5] 类型,即指向 5 个 int 数组的指针。

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

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

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

所以,根据上面的理解,

 int *ptr = &arr;

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

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

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

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com