当我使用这段代码时,GCC 给了我一个“从不兼容的指针类型初始化”的警告(尽管代码工作正常并且做了它应该做的事情,即打印数组的所有元素)。
#include <stdio.h>
int main(void)
{
int arr[5] = {3, 0, 3, 4, 1};
int *p = &arr;
printf("%p\n%p\n\n", p);
for (int a = 0; a < 5; a++)
printf("%d ", *(p++));
printf("\n");
}
但是当我使用这段代码时没有给出警告
int main(void)
{
int arr[5] = {3, 0, 3, 4, 1};
int *q = arr;
printf("%p\n%p\n\n", q);
for (int a = 0; a < 5; a++)
printf("%d ", *(q++));
printf("\n");
}
这两个片段之间的唯一区别是我分配了 *p = &arr 和 *q = arr。
- & 到底有什么不同?
- 为什么代码在两种情况下执行并给出完全相同的输出?
最佳答案
&arr
给出一个数组指针,一个特殊的指针类型int(*)[5]
,它指向整个数组。arr
,当写在诸如int *q = arr;
的表达式中时,“衰减”为指向第一个元素的指针。完全等同于int *q = &arr[0];
在第一种情况下,您尝试将 int(*)[5]
分配给 int*
。这些是不兼容的指针类型,因此是编译器诊断消息。
事实证明,数组指针和指向第一个元素的 int 指针很可能在内部具有相同的表示和相同的地址。这就是为什么第一个示例“有效”,即使它不是正确的 C。
关于c - 分配给指针时从不兼容的指针类型警告中初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44523828/