黑马程序员技术交流社区

标题: 指针问题 [打印本页]

作者: yangying514    时间: 2014-5-28 13:13
标题: 指针问题
本帖最后由 yangying514 于 2014-5-30 23:35 编辑


为什么调用里面用的&a,表示a的地址,而函数定义里面用*n表示指针变量所指向的存储空间的值。一个是地址,一个是地址里面保存的数据,不是一回事,怎么能这样写?

作者: wanzhu159    时间: 2014-5-28 13:30
我想楼主是想问a变量和指针变量n的区别,int a;这句话一写出来内存中分配一块int类型内存存储空间,叫做a,a里面存放的数据值是9,假如a的内存地址是0xxxx1。&a的意思是取出a的内存地址0xxxx1。然后把这个内存地址给指针n(指针只能存放二进制内存地址),*n的意思是找出指针变量n所存储的二进制地址(0xxxx1)对应那块存储空间;*n=10,就是把10覆盖掉那块存储空间里的数据。
作者: yangying514    时间: 2014-5-28 13:37
wanzhu159 发表于 2014-5-28 13:30
我想楼主是想问a变量和指针变量n的区别,int a;这句话一写出来内存中分配一块int类型内存存储空间,叫做a, ...

额。。。我是想问change(&a)传输的是a地址,但函数定义里面形参int *n传递的是a里面的值,这两个不配套啊
作者: 永远不会贬值    时间: 2014-5-28 17:06
本帖最后由 永远不会贬值 于 2014-5-28 17:07 编辑

因为是把变量a的地址传递给指针变量n,而*是访问指针变量所指向的地址的存储空间,并且可以更改该地址存储空间的值,不是传递,是直接更改了变量a存储空间的值
作者: 大龄产妇    时间: 2014-5-28 19:25
change()函数括号中有个隐藏的语句,传递的时候有个隐藏的赋值动作。例如:change(int *n)  当你把地址&a传递过去的时候,函数默认会认为有这样一个动作: int *n = &a; //定义一个指针指向a的地址,这样*n就能更改main函数中a的值了。  楼主懂了么?
作者: 夏沫的黄昏′    时间: 2014-5-28 19:46
int *n 是个指针没错, 但是 要传入的实参 a 不是指针 不能直接赋值给*n
需要利用 & (引用)  取出a的地址 给n  

指针与普通变量不同

*n  代表的是 “数据” 的起始地址  *n指向的依然是那块地址 虽然他输出的是值!
其实  *是一个” 解引用符“ , 真正的指针是n  而不是*n  
加上*以后 就解开了这个引用的地址 我们才能看到里面的数据

可能有点难懂  
大体意思就是  &a代表着a的内存地址 而 *n也是一个地址 只不过 为了方便理解 我们认为*n是一个值 其实
*n还是一个地址 只不过进行了解锁
作者: chain    时间: 2014-5-28 23:17
yangying514 发表于 2014-5-28 13:37
额。。。我是想问change(&a)传输的是a地址,但函数定义里面形参int *n传递的是a里面的值,这两个不配套 ...

这位同学没有认真听李老师的视频(开玩笑的):lol    李老师视频中强调过,int *p中(int*)是一个部分,函数定义中的形参只是一个指针变量p,而指针变量是用来存储地址的,所以实参必须是地址,而函数的代码中,*p是访问p指针变量所存储的地址,并改变其存储空间的值 ,两者应该区分开。   如果说的不对 ,勿怪
作者: Devchen    时间: 2014-7-8 11:03
yangying514 发表于 2014-5-28 13:37
额。。。我是想问change(&a)传输的是a地址,但函数定义里面形参int *n传递的是a里面的值,这两个不配套 ...

int (*n)这样看更好些,表示传进一个整形的指针变量。
作者: 魇影    时间: 2014-7-8 14:18
本帖最后由 魇影 于 2014-7-8 14:25 编辑

形参(int *)n,括号内的是一个整体,表示n接收的是一个指针。传进去的&a,其中a值是90,而&a就是一个地址,可能是0xff03什么的。
也就是说函数最终接受的是0xff03这个东西,赋值给n,n的值是0xff03。(n = 0xff03)
然后函数中*n就会会去找内存中地址是0xff03的变量(也就是a所在的位置),并改变它的值。
结果就是a的值被改成10了。

作者: 魇影    时间: 2014-7-8 14:33
魇影 发表于 2014-7-8 14:18
形参(int *)n,括号内的是一个整体,表示n接收的是一个指针。传进去的&a,其中a值是90,而&a就是一个地址, ...

我嘞个去,被楼上骗了,没看见发帖时间,囧死了。。。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2