我正在学习 C,经过大量研究(阅读 K&R 书(仍在阅读),阅读一些文章和一些关于 SO 的答案)并采取一些措施后,我在真正理解 C 中的数组和指针方面遇到了一些麻烦一路上有大量的笔记,我决定做一个小测试/程序来证明我的理解并消除一些疑虑,但我仍然对使用此代码时收到的警告感到困惑:
#include <stdio.h>
int main(int argc, char **argv) {
char a[3] = {1, 2, 3};
char *p = &a;
printf("%p\n", a); /* Memory address of the first element of the array */
printf("%p\n", &a); /* Memory address of the first element of the array */
printf("%d\n", *a); /* 1 */
}
使用 GNU GCC v4.8.3 编译输出:
warning: initialization from incompatible pointer type
char *p = &a;
^
0x7fffe526d090
0x7fffe526d090
1
使用 VC++ 编译输出:
warning C4047: 'initializing' : 'char *' differs in levels of indirection from 'char (*)[3]'
00000000002EFBE0
00000000002EFBE0
1
如果 &a
和 a
应该具有相同的值,并且在仅使用 a
时编译时不会出现警告,为什么我会收到此警告p
的初始化器?
最佳答案
&a
是整个数组的内存地址。它与第一个元素的地址具有相同的值(因为整个数组从第一个元素开始),但它的类型是“指向数组的指针”而不是“指向元素的指针”。因此发出警告。
关于c - 使用带有数组的 `addres of` 运算符作为指针的初始值设定项时收到警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28635007/