c - 分配给指针时从不兼容的指针类型警告中初始化

标签 c arrays pointers

当我使用这段代码时,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/

相关文章:

c - Netfilter:阅读应用程序级别的内容?

javascript - 如何将单词变成整数

c++ - 按类型比较指针?

c - 单个数组元素会衰减为指针吗?

c - 循环中的运算符性能

c - 如果我使用这种方法弹出元素,我怎么知道堆栈是空的?

c - c中哈希表的查找函数?

arrays - 访问 map 列表有不同的行为,具体取决于索引

python - 比较 NumPy arange 和自定义范围函数以生成具有小数增量的范围

c - 以相反的顺序打印双向链表?