鱼C论坛

 找回密码
 立即注册
查看: 1194|回复: 11

[已解决]关于指针问题,请看代码,大神能否解释下代码中的疑问

[复制链接]
发表于 2020-8-23 13:42:45 | 显示全部楼层 |阅读模式

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

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

x
#include <stdio.h>
int main(void)
{   int *o;
    int i=3;
    o=&i;
    printf("*o:%d\n",*o);
    printf("o:%p\n",o);
    printf("o:%d\n",o);
    int array[2][3]={{1,2,3},{4,5,6}};
    int (*p)[3]=array;
    printf("*p:%d\n",*p);//疑问这里的*p和上面的*o写法一样,为什么上面是取该指针变量指向的值,底下*p是存放的指针(地址)
    printf("*p:%p\n",*p);
    printf("*(*p):%d\n",*(*p));
    printf("**(p+1):%d\n",**(p+1));
    return 0;
}
运行结果:
*o:3
o:000000000061FE0C
o:6422028
*p:6422000
*p:000000000061FDF0
*(*p):1
**(p+1):4
最佳答案
2020-8-23 15:39:52
p是指向指针的指针,也就是说p指向的地址中的值是另一个指针,另一个指针所指向的地址中的值才是真正的值
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-8-23 15:39:52 | 显示全部楼层    本楼为最佳答案   
p是指向指针的指针,也就是说p指向的地址中的值是另一个指针,另一个指针所指向的地址中的值才是真正的值
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-23 21:26:39 | 显示全部楼层
数组名本身就是指针,根据注释的上一行可以理解为,*p是指向数组名的指针(个人理解)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-23 22:15:34 | 显示全部楼层
本帖最后由 风过无痕1989 于 2020-8-23 22:18 编辑

&i 就是取变量 i 的地址,然后将该地址交给了变量 o ,也即 o 贮存的是 i 的地址,*o 是指针变量,通过该指针变量存储的数据(地址),能够间接获得该地址上的数据 i,printf("o:%p\n",*o);

array[2][3] 本是个二维数组,但若是你将 array[2] 看作是该数组的名称的话,那它就成了一维数组。array[2] 这个数组名就可以看成是一个地址的指针。------ “C语言标准规定,当数组名作为数组定义的标识符(也就是定义或声明数组时)、sizeof 或 & 的操作数时,它才表示整个数组本身,在其他的表达式中,数组名会被转换为指向第 0 个元素的指针(地址)。”

有了这个概念后,就不难理解 array[2] = p 指向的是一个地址,也就是 array[2][3] 这个单元的地址,*p = *array[2] 就是取得 array[2] 的值,这个值它就是一个地址。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2020-8-24 10:41:26 | 显示全部楼层
首先,数组名里存放的是数组第一个数的地址,从某种角度看,数组名类似于指针(但他不是指针)

其次,int (*p)[3]=array;这行语句创建了一个名字为“*p”的数组,所以*p存放的是该数组第一个元素的地址(划重点),而不是值。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-24 23:10:04 | 显示全部楼层
加载中.. 发表于 2020-8-24 10:41
首先,数组名里存放的是数组第一个数的地址,从某种角度看,数组名类似于指针(但他不是指针)

其次,in ...

int (*p)[3]是一个数组指针啊,他指向一个数组,他不是数组啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-25 09:21:24 | 显示全部楼层
duoqingang 发表于 2020-8-24 23:10
int (*p)[3]是一个数组指针啊,他指向一个数组,他不是数组啊

对的,*p 是一个数组指针,指向的是 array[2] 这个数组名的三列数组
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2020-8-25 13:46:25 | 显示全部楼层
定义时 p 和 o 的写法都不一样呢!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2020-8-26 12:13:04 | 显示全部楼层
duoqingang 发表于 2020-8-24 23:10
int (*p)[3]是一个数组指针啊,他指向一个数组,他不是数组啊

不好意思,是我菜了,忘了还有这个概念,不好意思
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-26 20:53:22 | 显示全部楼层
本帖最后由 xiaozhangxuexi 于 2020-8-26 21:33 编辑

之前被这个问题困扰过一段时间。定义的p是指向有三个元素的数组的指针。指向数组的指针与指向数组元素的指针可不一样哈。指向数组元素的指针就是直接指向数组第一个元素,现在我们用的指向数组指针它就是直接指向一个数组的,不知道具体指向哪个元素。在这里p指向的是二维数组array中的第一行这个数组。之后进行*p取值操作后*p就是二位数组array中第一行的首个元素的地址了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2020-8-28 12:17:21 | 显示全部楼层
本帖最后由 duoqingang 于 2020-8-28 12:18 编辑
Cool_Breeze 发表于 2020-8-25 13:46
定义时 p 和 o 的写法都不一样呢!


注意到了,一个是定义指针变量,一个是定义数组指针
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-28 12:25:02 | 显示全部楼层
xiaozhangxuexi 发表于 2020-8-26 20:53
之前被这个问题困扰过一段时间。定义的p是指向有三个元素的数组的指针。指向数组的指针与指向数组元素的指 ...

有道理
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-13 07:31

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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