关于指针,求解释……
程序如下:#include <stdio.h>
int main()
{
int temp = {1,2,3,4,5};
int (*p2) = &temp;
int i;
printf("temp = %0x\ntemp+1 = %0x\np2 = %0x\np2+1 = %0x\n", temp, temp+1, p2, p2+1);
printf("*p2 = %0x\n*p2+1 = %0x\n*(p2+1) = %0x\n", *p2, *p2+1, *(p2+1));
printf("*(*p2) = %0x\n*(*p2+1) = %0x\n*(*(p2+1)) = %0x\n", *(*p2), *(*p2+1), *(*(p2+1)));
printf("================================================\n");
p2++;
printf("temp = %0x\ntemp+1 = %0x\np2 = %0x\np2+1 = %0x\n", temp, temp+1, p2, p2+1);
printf("*p2 = %0x\n*p2+1 = %0x\n*(p2+1) = %0x\n", *p2, *p2+1, *(p2+1));
printf("*(*p2) = %0x\n*(*p2+1) = %0x\n*(*(p2+1)) = %0x\n", *(*p2), *(*p2+1), *(*(p2+1)));
return 0;
}
运行结果:
可见:
temp是常量,代表数组的第一个地址
temp+1是地址计算,因为是int型数组,故temp+1相当于地址后移4个字节。
后面的就看不懂了…………
那么我根据结果推论一下:
1、p2是一个指针变量,类型不能确定……每次自增数值好像都在变化……这似乎有意义,但似乎又没有意义,求解释……
2、*p2也是一个指针变量,类型是int指针,而且正确的指向了temp!
还有很多疑问,我都不知道怎么写,那么大体上问一下如下几个问题:
1、p2到底是什么变量?类型如何?指向的是什么?
2、int (*p2)这样的表达式,到底声明了什么样的变量数组?创建了几个数组?分别是什么类型?
3、2里面这种表达式的实用性?例子?
{:10_285:} {:10_285:} {:10_285:} temp:数组首元素的地址22fe30
temp+1:temp为数组,元素是int,所以temp+1 = 22fe30 + 4 = 22fe34
p2:p2是指向 int 的指针,并且被赋值为temp的地址,所以 p2当然也是22fe30
p2+1:p2是指向 int 的指针,所以 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 的数组的指针,所以*(p2 + 1)是一个int的数组,也就是数组的首元素地址,所以*(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的数组 22fe44的首元素地址,所以*(*(p2 + 1))就是数组 22fe44的首元素22fe44 ,然而数组22fe44是未定义的,所以值是随机的,什么值都有可能
上面是一部分的解释,如果你看得懂,我再发另一半,如果上面的看不懂,现在发了你也看不懂,说明你还不够火候,需要再深入学习~ 倾天 发表于 2016-12-30 08:49
temp:数组首元素的地址22fe30
temp+1:temp为数组,元素是int,所以temp+1 = 22fe30 + 4 = 22fe34
p ...
先感谢指导~!多少解决了一些疑惑:
int (*p2) = &temp;
这里表达了大概这么几个信息:(按运算符优先级来顺序说)
1、p2是一个指针变量
2、p2指向一个 int的数组
(也就是说,p2的类型此时已经确定?p2的跨度是int的总长度==4*5==20字节?)
3、p2指向的这个int数组的起始地址为&temp的值
(难道p2和&temp是完全等价的?因为据后来我观察&temp+1也是一次跳20字节……)
那么,如果以上括弧内我的理解都是对的的话,你回复中的内容就全都是可以理解的了。
p2 == &temp (这个的跨度是20字节,即int的总长度)
*p2 == temp (这个的跨度是4字节,即一个int的长度)
这样理解对么? 补充一下,开启调试,然后可以获得以下结果:
希望有帮助。
zealstar 发表于 2016-12-30 09:27
先感谢指导~!多少解决了一些疑惑:
int (*p2) = &temp;
这里表达了大概这么几个信息:(按运算符优 ...
int (*p2) = &temp;
你说p2 和 &temp是不是等价的?
没错,你理解对了,恭喜 zealstar 发表于 2016-12-30 09:27
先感谢指导~!多少解决了一些疑惑:
int (*p2) = &temp;
这里表达了大概这么几个信息:(按运算符优 ...
另一半能看懂么? 目光所及之处 发表于 2016-12-30 10:23
补充一下,开启调试,然后可以获得以下结果:
感谢,稍有理解。
这里还好,已经能够接受了。
指向数组的指针
指针构成的数组
多少还是能区别出来的。
但是。。。。。甲鱼的课后作业好狠,他居然要弄出一个---指向“指针构成的数组”的“数组指针”
然后我懵比了……{:10_247:}
即便看了答案也不懂*运算符到底如何运作的……
估计还是太笨,再琢磨琢磨吧……{:10_266:} 倾天 发表于 2016-12-30 10:40
另一半能看懂么?
基本懂了,这里没多少问题了。关于数组指针大体上应该还是可以操作了吧。只是甲鱼的课后作业太狠,又懵比了,呵呵。再琢磨琢磨,下午再战……{:10_258:}
*p2和temp的唯一不同,大概就是temp是常量,而*p2是变量而已。
试过temp++是不可以编译的。但是*p2++就可以。
zealstar 发表于 2016-12-30 10:51
基本懂了,这里没多少问题了。关于数组指针大体上应该还是可以操作了吧。只是甲鱼的课后作业太狠,又懵比 ...
temp严格来说是数组,不是指针,所以不能自增
页:
[1]