鱼C论坛

 找回密码
 立即注册
查看: 4887|回复: 22

定义的数组指针,为什么*p跟p的值相等呢?求大牛解答

[复制链接]
发表于 2016-12-4 13:08:42 | 显示全部楼层 |阅读模式

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

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

x
#include <stdio.h>
int main()

{
        int a[3] = { 1,2,3 };
       

        int(*p)[3] = &a;
        printf("%p %p\n",*p, p);






        return 0;
}

如上代码,希望大牛能够帮帮我,感谢。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-12-4 13:10:15 | 显示全部楼层
本人愚见是,*是取值运算符,它的值是指针变量P中的内容所指向的内存单元地址的值,那应该跟a[0]的结果是一样的才对啊,为什么*p也会是一个地址呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-12-4 14:38:21 | 显示全部楼层
这个时候多么希望有个高手解答我的疑惑,我会静静的等待,感谢。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-12-4 14:58:51 From FishC Mobile | 显示全部楼层
*p本身就是个地址,在加个*就指向元素了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-12-4 15:01:36 | 显示全部楼层
hb328496536 发表于 2016-12-4 14:58
*p本身就是个地址,在加个*就指向元素了

你好,p本身存放的是一个地址,为什么*p还是这个地址呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-12-4 15:01:52 From FishC Mobile | 显示全部楼层
指向指针的指针
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-12-4 15:04:43 | 显示全部楼层
本帖最后由 xiawiner 于 2016-12-4 15:11 编辑


我还是不明白,指向指针的指针不是**吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-12-4 15:06:49 | 显示全部楼层
我的理解是  p[3]   p本身就是指针,,,在加个(*p)[3]等于是指向指针的指针,两个都是地址
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-12-4 15:08:19 | 显示全部楼层
**p[0]   应该就指向元素了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-12-4 15:09:05 | 显示全部楼层
我的大概理解,希望有大牛指教
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-12-4 15:14:45 | 显示全部楼层
hb328496536 发表于 2016-12-4 15:08
**p[0]   应该就指向元素了

*后面的操作数必须是指针型,P[0]显然不是,会报错的,还是谢谢你发表意见,但是这种误导不是很值得赞赏
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-12-4 15:28:51 | 显示全部楼层
**p还是可以的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-12-4 15:29:57 | 显示全部楼层
那就证明p[1]  p[2]  p[3]  里存的是指针地址了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-12-4 15:30:28 | 显示全部楼层
p[0]  p[1]   p[2]  打错了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-12-4 15:39:07 | 显示全部楼层
本帖最后由 xiawiner 于 2016-12-4 15:50 编辑

越来越麻烦了,求一针见血的答案。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-12-4 18:01:47 | 显示全部楼层
声明一个指针
int *p;          //假设此处为指针p开辟一个地址空间:1111 1111
a[3]={1,2,3}    //声明数组a,假设为a开辟的地址空间: 1111 1112
那么假如
p=a;
上面这一行的意思是:指针p所在的地址单元所存放的数据是1111 1112

即p:1111 1111 | 11111112

           ↑地址空间     ↑存储内容




*p=&a;
这一行的内容你需要一个简单的前置概念:数组也可以近似看成一个指向一堆数据的指针。
意思是把指针p的地址改为数组a的指针地址,即:

p:1111 1112 | ____ ____

        ↑地址空间  ↑未初始化的存储空间
按照这种赋值方式,你应该是打印不出来数组中的数据的,因为你并不是赋值过去了一个正经的数据,而是改变了指针的地址。




可能你还是会说看不懂看不懂看不懂,不过我就喜欢不动脑子假装努力的人。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 2 反对 0

使用道具 举报

发表于 2016-12-4 18:04:14 | 显示全部楼层
顺便谢谢你的鱼币,10个太少了,我建议给我30个,够我买一节课。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2016-12-4 18:11:12 | 显示全部楼层
四十二 发表于 2016-12-4 18:01
声明一个指针
int *p;          //假设此处为指针p开辟一个地址空间:1111 1111
a[3]={1,2,3}    //声明 ...

谢谢大牛的解答,我对内存的概念又有了新的见地。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-12-6 06:25:40 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-2-7 12:30:36 | 显示全部楼层
本人愚见:
int(*p)[3] = &a;//数组的指针,相当于是二级指针,指向指针的指针

比如 这样一个两行三列的数组:
[1 2 3]
[4 5 6]

p指向的是[1]这个位置,但是他的步长是3,p+1后指向的是[4]
而*p指向的是[1]这个位置,但是如果(*p+1)所指向的是[2]

而printf("%p %p\n",*p, p);这个所打印出的都是[1]这个位置的地址
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-28 00:50

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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