鱼C论坛

 找回密码
 立即注册
查看: 1449|回复: 8

关于指针,求解释……

[复制链接]
发表于 2016-12-30 04:18:53 | 显示全部楼层 |阅读模式

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

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

x
程序如下:
  1. #include <stdio.h>

  2. int main()
  3. {
  4.         int temp[5] = {1,2,3,4,5};
  5.         int (*p2)[5] = &temp;
  6.         int i;
  7.        
  8.         printf("temp = %0x\ntemp+1 = %0x\np2 = %0x\np2+1 = %0x\n", temp, temp+1, p2, p2+1);
  9.         printf("*p2 = %0x\n*p2+1 = %0x\n*(p2+1) = %0x\n", *p2, *p2+1, *(p2+1));
  10.         printf("*(*p2) = %0x\n*(*p2+1) = %0x\n*(*(p2+1)) = %0x\n", *(*p2), *(*p2+1), *(*(p2+1)));
  11.        
  12.         printf("================================================\n");
  13.         p2++;
  14.         printf("temp = %0x\ntemp+1 = %0x\np2 = %0x\np2+1 = %0x\n", temp, temp+1, p2, p2+1);
  15.         printf("*p2 = %0x\n*p2+1 = %0x\n*(p2+1) = %0x\n", *p2, *p2+1, *(p2+1));
  16.         printf("*(*p2) = %0x\n*(*p2+1) = %0x\n*(*(p2+1)) = %0x\n", *(*p2), *(*p2+1), *(*(p2+1)));

  17.     return 0;
  18. }
复制代码

运行结果:
3.png
可见:
temp是常量,代表数组的第一个地址
temp+1是地址计算,因为是int型数组,故temp+1相当于地址后移4个字节。
后面的就看不懂了…………
那么我根据结果推论一下:
1、p2是一个指针变量,类型不能确定……每次自增数值好像都在变化……这似乎有意义,但似乎又没有意义,求解释……
2、*p2也是一个指针变量,类型是int指针,而且正确的指向了temp!
还有很多疑问,我都不知道怎么写,那么大体上问一下如下几个问题:
1、p2到底是什么变量?类型如何?指向的是什么?
2、int (*p2)[5]这样的表达式,到底声明了什么样的变量数组?创建了几个数组?分别是什么类型?
3、2里面这种表达式的实用性?例子?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-12-30 08:49:02 | 显示全部楼层
temp:  数组首元素的地址  22fe30
temp+1:  temp为数组,元素是int,所以temp+1 = 22fe30 + 4 = 22fe34
p2:  p2是指向 int[5] 的指针,并且被赋值为temp的地址,所以 p2当然也是22fe30
p2+1:  p2是指向 int[5] 的指针,所以 p2 + 1 = 22fe30 + 4 * 5 = 22fe44
*p2:  p2是temp的地址, 所以*p2就是 temp ,而temp是22fe30, 所以 *p2就是22fe30
*p2+1:  *p2 是等于temp的,所以 *p2 + 1等于 temp + 1,所以等于22fe34
*(p2+1): p2 + 1 是22fe44 ,并且是指向 int[5] 的数组的指针,所以*(p2 + 1)是一个int[5]的数组,也就是数组的首元素地址,所以*(p2 + 1) = 22fe44
*(*p2): *p2是temp, 所以*(*p2)就是*temp,也就是temp的首元素 1
*(*p2+1):  *p2是temp首元素的地址,所以*p2 + 1 就是 temp第二个元素的地址,所以*(*p2 + 1)就是temp的第二个元素,也就是 2
*(*(p2+1)):*(p2 + 1)是一个int[5]的数组 22fe44的首元素地址,所以*(*(p2 + 1))就是数组 22fe44的首元素22fe44 [0],然而数组22fe44是未定义的,所以值是随机的,什么值都有可能

上面是一部分的解释,如果你看得懂,我再发另一半,如果上面的看不懂,现在发了你也看不懂,说明你还不够火候,需要再深入学习~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-12-30 09:27:22 | 显示全部楼层
倾天 发表于 2016-12-30 08:49
temp:  数组首元素的地址  22fe30
temp+1:  temp为数组,元素是int,所以temp+1 = 22fe30 + 4 = 22fe34
p ...

先感谢指导~!多少解决了一些疑惑:
int (*p2)[5] = &temp;
这里表达了大概这么几个信息:(按运算符优先级来顺序说)
1、p2是一个指针变量
2、p2指向一个 int[5]的数组
(也就是说,p2的类型此时已经确定?p2的跨度是int[5]的总长度==4*5==20字节?)
3、p2指向的这个int[5]数组的起始地址为&temp的值
(难道p2和&temp是完全等价的?因为据后来我观察&temp+1也是一次跳20字节……)

那么,如果以上括弧内我的理解都是对的的话,你回复中的内容就全都是可以理解的了。
p2 == &temp                  (这个的跨度是20字节,即int[5]的总长度)
*p2 == temp                   (这个的跨度是4字节,即一个int的长度)
这样理解对么?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-12-30 10:23:12 | 显示全部楼层
补充一下,开启调试,然后可以获得以下结果:
QQ截图20161230100139.png

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

使用道具 举报

发表于 2016-12-30 10:38:45 | 显示全部楼层
zealstar 发表于 2016-12-30 09:27
先感谢指导~!多少解决了一些疑惑:
int (*p2)[5] = &temp;
这里表达了大概这么几个信息:(按运算符优 ...

int (*p2)[5] = &temp;
你说p2 和 &temp是不是等价的?

没错,你理解对了,恭喜
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-12-30 10:40:46 | 显示全部楼层
zealstar 发表于 2016-12-30 09:27
先感谢指导~!多少解决了一些疑惑:
int (*p2)[5] = &temp;
这里表达了大概这么几个信息:(按运算符优 ...

另一半能看懂么?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-12-30 10:42:32 | 显示全部楼层
目光所及之处 发表于 2016-12-30 10:23
补充一下,开启调试,然后可以获得以下结果:

感谢,稍有理解。
这里还好,已经能够接受了。

指向数组的指针

指针构成的数组

多少还是能区别出来的。

但是。。。。。甲鱼的课后作业好狠,他居然要弄出一个---指向“指针构成的数组”的“数组指针”
然后我懵比了……
即便看了答案也不懂*运算符到底如何运作的……
估计还是太笨,再琢磨琢磨吧……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-12-30 10:51:23 | 显示全部楼层
倾天 发表于 2016-12-30 10:40
另一半能看懂么?

基本懂了,这里没多少问题了。关于数组指针大体上应该还是可以操作了吧。只是甲鱼的课后作业太狠,又懵比了,呵呵。再琢磨琢磨,下午再战……

*p2和temp的唯一不同,大概就是temp是常量,而*p2是变量而已。
试过temp++是不可以编译的。但是*p2++就可以。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-12-30 10:54:43 | 显示全部楼层
zealstar 发表于 2016-12-30 10:51
基本懂了,这里没多少问题了。关于数组指针大体上应该还是可以操作了吧。只是甲鱼的课后作业太狠,又懵比 ...

temp严格来说是数组,不是指针,所以不能自增
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-9 07:57

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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