c++中字符指针作形参出现疑问

#include<iostream>
using namespace std;
void test(char *p)
{ p="B";
}
int main()
{ char p[10]="A";
test(p);
cout<<p;
}
为什么输出的不是B

由于函数声明为void test(char *p); 这种是传值参数,当进行test(p);函数调用时,实参p把它的值,也就是字符串常量"A"的首地址赋值给了形参p,但注意这是形参p是实参p的一个副本,而不是实参p的引用。当执行p="B";时,形参p的值就被改写为字符串常量"B"的首地址,但实参p和形参p是两个独立的变量,因此对形参p的修改不会影响到实参p,所以实参p的值仍然是字符串常量"A"的首地址。由于形参p的作用域是在test函数内,所以当test调用结束,形参p也会被释放掉。当执行cout<<p;是输出的是指向字符数组的首地址指针的值,由于test函数没有改变字符数组的值,所以输出A而不是B。
如果你想输出B的话,可以把函数改为
void test(char *&p)
{ p="B";
}
这是用引用的方式传值。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-11-22
在main()函数中指针p已指向指定的字符串"A",即是确定值,所以无法修改了!
第2个回答  2012-11-22
你test函数内改变的只是形参的值,要改变实参的值应使用引用,即定义成void test(char *&p)。
但是char p[10]="A";这里的p是数组,是不能改变值的,要定义成指针即char *p = "A"才可以。也就是改成:
#include<iostream>
using namespace std;
void test(char *&p)
{ p="B";
}
int main()
{ char *p="A";
test(p);
cout<<p;
}追问

我还想问一下 是不是现在实参和型参p都指向字符串A的地址 不过形型改变了指向没有改变A所在地址的值 只有引用才能改变实参的指向 这理解对吗

追答

对。指针赋值本来就是改变指向,要改变指向地址的值是*p = xxx

追问

本回答被网友采纳
相似回答