在使用char* 和char*&传值的时候:
void printNoref(char * s){
cout<<"No ref str:"<<s<<endl;
s++;
cout<<"No ref str:"<<s<<endl;
}
void printref(char *& s){
cout<<"ref str:"<<s<<endl;
s++;
cout<<"ref str:"<<s<<endl;
}
int main() {
string s ( "123456789");
char* str = new char[s.size() + 1];
strcpy(str, s.c_str());
printNoref(str);
cout<<"main str:"<<str<<endl;
cout<<"================"<<endl;
printref(str);
cout<<"main str:"<<str<<endl;
return 0;
}
结果为:
No ref str:123456789
No ref str:23456789
main str:123456789
================
ref str:123456789
ref str:23456789
main str:23456789
char* 传递的是指针?为什么效果却和pass by value的方式一样,指针不是应该和pass by reference的方式一样吗?
请求解答
============
补充问题:
【此部分代码未贴出,只贴出结果】
真实 str 地址:0x7ffcf092ee08
str 指向的地址:0x1481c20
非引用传值函数中s 地址:0x7ffcf092ede8
s 指向的地址:0x1481c20
str:23456789
str 指向的地址:0x1481c20 值 str:123456789
================
引用传值函数中s 地址:0x7ffcf092ee08
s 指向的地址:0x1481c20
ref str:23456789
str 指向的地址:0x1481c21 值 str:23456789
可以看出,在char*的函数中,原来str的地址中的值被复制到新的临时地址中去了,
而 char* & 使用的是原来的地址;
尽管 两个函数的参数类型分别要求是 char* 和 char*&, 两者都是把地址传到函数中,都可以对传入的指针指向的值进行修改, 但是两者对主调函数的指针影响不同。 前者只能对传入的指针指向的值进行修改,对函数外的指针无影响。后者,即 char*& , 是将参数(字符串指针)的地址 再次强制转化成字符指针型, 这就有可能改变函数外指针指向的值,因为此指针已经不是传入字符串的指针了。
参考:c++ char* char*&的区别