c - 指针符号

标签 c arrays pointers

我并不觉得指针理论特别麻烦,但我偶尔会对某些符号感到困惑。在下面的示例中,有人可以解释 p = (int*) a 行是如何工作的。我对代码的解释表明,这一行只是将第一个数组的第一个元素的地址存储在指针 p 中,这样 printf("%u", *p)yields 5。如果是这种情况,这一行是否只是一种更间接的书写方式 p = a[0]

int main()
{
    int a[][4] = {
        5, 7, 5, 9,
        4, 6, 3, 1,
        2, 9, 0, 6
        };



    int *p; // create an integer pointer
    int (*q)[4]; // create a pointer to a four-element integer array

    p = (int*)a; // ?
    q = a;


    printf("%u %u\n", p, q);
    p++;
    q++;
    printf("%u %u\n", p, q);


    return 0;
}

最佳答案

表达式a , 当在值上下文中使用时,确实会评估为“数组第一个元素的地址 a ” - a[0] 的地址-正如您正确理解的那样。

但是,请注意数组 a实际上就是我们所说的 2D 数组。它是一个数组的数组。数组的第一个元素 a本身就是一个数组:类型为 int [4] 的数组.因此,考虑到上述情况,表达式 a , 在值上下文中使用时,等同于表达式 &a[0] , 这是一个 int (*)[4] 类型的指针并且在概念上指向整个一维数组 a[0] .

为此,尝试做

p = a;

将导致来自编译器的诊断消息。分配 int (*)[4] 是非法的int * 的值指针对象。这些类型不兼容。为了抑制此诊断消息,有问题的代码使用显式转换

p = (int *) a;

这有力地插入了上述 int (*)[4]指向 p 的指针值.在典型的实现中,这保留了原始指针的数值,仅执行概念类型转换。

尝试访问 *p 的值通常会产生 a[0][0] 的值仅仅是因为数字整个a的地址与a[0]的地址相同与a[0][0]的地址相同.上面的代码利用了这个数字身份,同时使用显式转换来解决类型不兼容问题。

关于c - 指针符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15123187/

相关文章:

c - fopen 不会打开文件,通过 fgets 提供完整路径

javascript - 通过包含函数的数组反转循环方向,无需 jQuery

c - 将类型转换数组返回到主函数

Python - 将正整数拆分为数组的快速方法

c - C语言如何创建指向位的指针

c++ - 在 C++ 中交换指针地址

c - 如何从标准FILE结构获取文件名?

c - Linux 终端 - 打印大量数据

c - 我在使用 strcat 时遇到段错误。请告诉我出了什么问题

c++ - 在 C++ 中强制删除 std::shared_ptr