免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2731 | 回复: 4
打印 上一主题 下一主题

关于指针变量做函数参数的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-02-25 17:13 |只看该作者 |倒序浏览
请教大家,怎样理解调用函数不可能改变实参指针变量的值,但可以改变实参指针变量所指变量的值。

论坛徽章:
0
2 [报告]
发表于 2009-02-25 17:27 |只看该作者
因为你在函数里操作的只是实参地址的一份拷贝,就是说指针a的值在函数里的一份拷贝b。。。。你修改b是没有用的,函数执行完了b在栈上分配的空间就释放了,这个你应该明白吧?
但是,a和b所指向的地址都是一样的,所以,你可以修改它们,因为它们可不是你在函数执行时的一份拷贝哦

PS:所以说C或者C++里不存在真正的址传递方式嘛。。。。
不能改变实参指针变量的值,但可以改变实参指针变量所指变量的值,这就是最好的说明

论坛徽章:
0
3 [报告]
发表于 2009-02-25 17:28 |只看该作者
  1. #include <stdio.h>

  2. void fn(char *a)
  3. {
  4.         *a = 'b';
  5.         a = (char *)0x100;       
  6. }

  7. int main(void)
  8. {
  9.         char *p;

  10.         p = (char *)malloc(sizeof(char));

  11.         *p = 'a';

  12.         printf("p = %p, *p = %c\n", p, *p);
  13.        
  14.         fn(p);

  15.         printf("p = %p, *p = %c\n", p, *p);

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


在fn()中,你分别改变*a 和 a的值,但是只有*a的改变有效,也就是实参p所指向的内容改变了,但是p本身并没有改变

论坛徽章:
0
4 [报告]
发表于 2009-02-26 08:57 |只看该作者
请理解函数的传参数都是传值操作

论坛徽章:
0
5 [报告]
发表于 2009-02-26 14:44 |只看该作者
#include <stdio.h>

void fn(char *p1)
{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*p1 = 'b';
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p1 = (char *)0x100;      
}

int main(void)
{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char *p2;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p2 = (char *)malloc(sizeof(char));

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fn(p2);

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return 0;
}


参数都是传值的,指针也不例外,拿上面代码来说,p1和p2完全是两个不同的变量,只是两个变量的值相等,就是指向同一个int变量而已
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP