C/C++ 为什么在函数内部修改形参并不能真正地改变传入形参的值?

voidGetMemory(char*p){p=(char*)malloc(100);}voidTest(void){char*str=NULL;GetMemory(st... void GetMemory( char*p )
{
 p = (char*) malloc( 100 );
}
void Test( void )
{
 char*str = NULL;
 GetMemory( str );
 strcpy( str, "hello world" );
 printf( str );
}

试题4传入中GetMemory(char *p )函数的形参为字符串指针,在函数内部修改形参并不能真正的改变传入形参的值,执行完
char *str = NULL;
GetMemory( str );
后的str仍然为NULL;
展开
 我来答
我乜是醉了
2014-10-12 · 超过16用户采纳过TA的回答
知道答主
回答量:30
采纳率:0%
帮助的人:30.9万
展开全部

一般有两种传递方式:

1)值传递----包括(数值传递,指针传递) 

2)引用传递

你问题中的指针传递,其实就是值传递:(下面这个你能看懂么)

void GetMemory( char p )
{
 p = ‘a’;
}
void Test( void )
{
 char str;
 GetMemory( str );
 pinrtf("%c",str);
}

---------------------------------------------

引入你的这个问题,你虽然将Test中的指针地址传过去了,char *p确实也接受到了,但是:

p = (char*) malloc( 100 );这条语句中,malloc会返回一个新的地址,同时赋值给p,p已经不是原来的地址了。

void GetMemory( char*p )
{
 p = (char*) malloc( 100 );
}
void Test( void )
{
 char*str = NULL;
 GetMemory( str );
 strcpy( str, "hello world" );
 printf( str );
}

此时,p是指向一块大小为100的空间。但是str还是指向NULL

追问
值传递的话,形参在函数内只能作为右值,而不能作为左值吗?
追答
是。
值传递就相当于是拷贝,也就是赋值:
如:
int a = 10;
int b;
b = a;
雾里无言
推荐于2017-10-14 · 超过21用户采纳过TA的回答
知道答主
回答量:40
采纳率:0%
帮助的人:33.4万
展开全部
一般函数的传递都是值传递,不会改变函数外的变量值。
若是使用引用或指针,就是地址传递,相当于将变量的地址赋值给了形参,而地址指向的内存是同一块,这时会改变原变量的值
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式