c - 使用带有数组的 `addres of` 运算符作为指针的初始值设定项时收到警告

标签 c arrays pointers

我正在学习 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

如果 &aa 应该具有相同的值,并且在仅使用 a 时编译时不会出现警告,为什么我会收到此警告p 的初始化器?

最佳答案

&a 是整个数组的内存地址。它与第一个元素的地址具有相同的值(因为整个数组从第一个元素开始),但它的类型是“指向数组的指针”而不是“指向元素的指针”。因此发出警告。

关于c - 使用带有数组的 `addres of` 运算符作为指针的初始值设定项时收到警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28635007/

相关文章:

c - fatal error #1035 : Can't find include file "stdafx.h"

c - 将 4 个字符 [a-z] "literal"作为 uint16_t

java - 使用递归解决二维数组迷宫

c - C 中两个数组元素地址之间的偏移量

c - 是否有标准的指针大小声明?

C:返回调用函数时变量值变脏

c - 遍历链表会删除数据

javascript - 按属性值对 JavaScript 对象数组进行排序

c - 不同类型的双(或高阶)指针有什么区别吗?

c++ - Const char* 指针