将“addres of”运算符与数组一起用作指针的初始值设定项时收到警告
Getting warning when using `addres of` operator with array as an initializer to a pointer
我正在学习 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
作为 [=16= 的初始值设定项时编译时没有警告,为什么我会收到此警告]?
&a
是整个数组的内存地址。它与第一个元素的地址具有相同的值(因为整个数组从第一个元素开始),但它的类型是 "pointer to array" 而不是 "pointer to element"。因此警告。
您正在尝试使用指向 char[3]
的指针初始化 char*
,这意味着 char(*)[3]
。
不出所料,编译器抱怨不匹配。
您想做的是利用数组衰减(数组名称在大多数上下文中衰减为指向其第一个元素的指针):
char* p = a;
顺便说一句,%p
仅适用于 void*
,尽管这种不匹配,尽管官方是 Undefined Behavior,可能是无害的。
我正在学习 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
作为 [=16= 的初始值设定项时编译时没有警告,为什么我会收到此警告]?
&a
是整个数组的内存地址。它与第一个元素的地址具有相同的值(因为整个数组从第一个元素开始),但它的类型是 "pointer to array" 而不是 "pointer to element"。因此警告。
您正在尝试使用指向 char[3]
的指针初始化 char*
,这意味着 char(*)[3]
。
不出所料,编译器抱怨不匹配。
您想做的是利用数组衰减(数组名称在大多数上下文中衰减为指向其第一个元素的指针):
char* p = a;
顺便说一句,%p
仅适用于 void*
,尽管这种不匹配,尽管官方是 Undefined Behavior,可能是无害的。