gpt4 book ai didi

c - 指向数组的指针如何工作?

转载 作者:行者123 更新时间:2023-11-30 18:40:52 25 4
gpt4 key购买 nike

int s[4][2] = {
{1234, 56},
{1212, 33},
{1434, 80},
{1312, 78}
};

int (*p)[1];
p = s[0];

printf("%d\n", *(*(p + 0))); // 1234
printf("%d\n", *(s[0] + 0)); // 1234
printf("%u\n", p); // 1256433(address of s[0][0])
printf("%u\n", *p); // 1256433(address of s[0][0])

任何人都可以解释为什么执行 *(*(p + 0)) 会打印 1234,而执行 *(s[0] + 0)p = s[0] 时,code> 也会打印 1234,并且为什么 p*p 给出相同的结果?

感谢您的期待。

最佳答案

这就是数组在 C 中的工作方式——数组不是一流类型,因为除了声明它们并获取它们的大小之外,您不能对它们执行任何操作。在任何其他上下文中,当您使用类型为数组(任何类型)的表达式时,它会默默地转换为指向数组第一个元素的指针。这通常称为数组“衰减”为指针。

那么让我们一一看看您的陈述:

p = s[0];

在这里,s具有数组类型(它是 int[4][2] —— 2D int 数组),因此它会默默地转换为指向其第一个元素的指针( int (*)[2] ,指向包含 1234 的单词)。然后,您可以使用 [0] 对此进行索引其中添加 0 * sizeof(int [2])字节到指针,然后取消引用它,给你一个 int [2] (2 个整数的一维数组)。由于这是一个数组,它会默默地转换为指向其第一个元素的指针( int * 指向 1234 )。请注意,这与索引之前的指针相同,只是指向的类型不同。

然后您分配此 int *p ,声明为 int (*)[1] 。由于 C 允许将任何指针分配给任何其他指针(即使指向的类型不同),因此这是可行的,但任何合理的编译器都会给您一个类型不匹配警告。

p现在指向包含 1234 的单词(与您从 s 获得的指针指向的位置相同)

printf("%d\n", *(*(p+0)));

这首先添加 0*sizeof(int[1]) p 并取消引用它,给出一个数组 (int[1]),该数组立即衰减为指向其第一个元素的指针( int * 仍然指向同一位置)。然后取消引用 THAT 指针,给出 int 值 1234这是打印出来的。

printf("%d\n", *(s[0]+0));

我们有s[0]再次通过第一行描述中提到的多重衰减和取消引用过程,变成 int *指着1234 。我们添加0*sizeof(int)到它,然后取消引用,给出整数 1234 .

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

p是一个指针,所以简单地打印了指针的地址。

printf("%u\n",*p)

p被取消引用,给出 int [1] (一维整数数组)衰减为指向其第一个元素的指针。然后打印该指针。

关于c - 指向数组的指针如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24459141/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com