gpt4 book ai didi

c - 为什么代码不打印指针指向的值?

转载 作者:行者123 更新时间:2023-12-02 08:36:16 25 4
gpt4 key购买 nike

这是源码

int main()
{
int s[4][2]={
{1,2},
{3,4},
{5,6},
{7,8},
};
printf("%d\n",*(s+2);
return 0;
}

上面的代码是打印 s[2] 或 (s+2) 数组的基地址,即元素 5 的地址但为什么它不打印值(value) 5

最佳答案

s是指向数组 s 的第一个元素的指针(衰减后),即数组的第一行 s .它的类型是 int (*)[2] ,即指向 2 数组的指针元素。 s=2是指向数组 s 的第 3 行的指针.

另一方面*s类型为 int [2] ,即 2 的光线int s,这是因为 *正在取消引用指针表达式 s (它衰减到指向第一行的指针)导致 2 的数组诠释的。自 8s也是一个数组,它将衰减到指向其第一个元素的指针,即 s[0][0] .

现在*(s+2)正在取消引用数组的第 3 行 s .它还将给出一个数组 2 int秒。此外,它将衰减到指向其第一个元素的指针,即 s[0][2]。 .
所以,经过上面的讨论你可以说s是一个指向执行所有衰减后的指针的指针(不完全是)。

取消引用指向指向 int指针(衰减后)会给你一个指向int的指针 。您需要再次取消引用 *(s+2)得到它指向的值。

printf("%d\n",*(*(s+2));  

注意: s , *s , &s , &s[0] , &s[0][0]所有都指向相同的位置,但都是不同类型

(s+2)是指向数组 s 的第 3 行的指针.它会给你第三行的起始地址。 *(s+2)是指向第 3 行第一个元素的指针,即它会给你元素的地址 s[0][2] .尽管这两者都为您提供相同的打印位置值,但它们属于不同类型。

关于c - 为什么代码不打印指针指向的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21120501/

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