鱼C论坛

 找回密码
 立即注册
查看: 83|回复: 1

[已解决]学习数组指针和指针数组遇到的一个疑问

[复制链接]
发表于 2024-5-24 00:33:28 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#include <stdio.h>

int main()
{
        int array[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
        int (*p)[10] = &array;

        printf("%d\n", *(*(p+1)-6));

        return 0;
}

我去试着打印了地址,发现p+1和*(p+1)地址是一样的,但是(p+1)-2和(*(p+1)-2)打印的地址完全不一样,第一个的减法每一次都减了10*4也就是40个,但是第二个,是先用*(p+1)拿到array[10]的地址,再减去8个字节,就拿到了array[8]的地址,这时候再用*号就可以拿到值了
这里面最不理解的就是为啥要用*取一次地址,然后再用*取一次,才能够拿到值,不是*就可以直接取指针的值吗
最佳答案
2024-5-24 00:33:59
你的疑问很好!让我们来解释一下。

在你的代码中,变量 "p" 是一个指向整型数组 "array" 的指针。当我们使用 "p+1" 时,实际上是将指针 "p" 向后移动了一个整型的大小,也就是4个字节(如果你的机器上一个整型占用4个字节的话)。所以,"p+1" 的结果就是指向了数组 "array" 中下一个元素的地址。

当你使用 "*(p+1)" 时,你实际上是获取了指针 "p+1" 指向的地址中存储的值。这个地址就是数组 "array" 的第二个元素的地址。由于数组的元素类型是整型,所以通过 "*(p+1)" 就可以获取到这个整型值。

所以,为什么我们需要用两个 "*" 来获取数组中的元素值呢?这是因为 "*(p+1)" 返回的是一个指向整型的指针,而不是实际的整型值。如果我们想要获取指针指向的那个整型值,就需要再使用一个 "*" 运算符来间接地访问这个值。

所以,在你的代码中,"*(*(p+1)-2)" 的作用是先将指针 "p+1" 指向的地址减去2个整型的大小(即8个字节),然后再获取这个地址中存储的整型值。

希望这个解释能够帮助你理解指针和指针运算的概念!如果还有其他问题,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-5-24 00:33:59 | 显示全部楼层    本楼为最佳答案   
你的疑问很好!让我们来解释一下。

在你的代码中,变量 "p" 是一个指向整型数组 "array" 的指针。当我们使用 "p+1" 时,实际上是将指针 "p" 向后移动了一个整型的大小,也就是4个字节(如果你的机器上一个整型占用4个字节的话)。所以,"p+1" 的结果就是指向了数组 "array" 中下一个元素的地址。

当你使用 "*(p+1)" 时,你实际上是获取了指针 "p+1" 指向的地址中存储的值。这个地址就是数组 "array" 的第二个元素的地址。由于数组的元素类型是整型,所以通过 "*(p+1)" 就可以获取到这个整型值。

所以,为什么我们需要用两个 "*" 来获取数组中的元素值呢?这是因为 "*(p+1)" 返回的是一个指向整型的指针,而不是实际的整型值。如果我们想要获取指针指向的那个整型值,就需要再使用一个 "*" 运算符来间接地访问这个值。

所以,在你的代码中,"*(*(p+1)-2)" 的作用是先将指针 "p+1" 指向的地址减去2个整型的大小(即8个字节),然后再获取这个地址中存储的整型值。

希望这个解释能够帮助你理解指针和指针运算的概念!如果还有其他问题,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-6-17 00:13

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表