char* 传值问题

亲情的三分 发布于 2018/06/27 11:46
阅读 952
收藏 0

开源之夏第三届火热来袭,高校学生参与赢万元奖金!>>>

在使用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* & 使用的是原来的地址;

 

加载中
0
tcxu
tcxu

尽管 两个函数的参数类型分别要求是 char* 和 char*&, 两者都是把地址传到函数中,都可以对传入的指针指向的值进行修改, 但是两者对主调函数的指针影响不同。 前者只能对传入的指针指向的值进行修改,对函数外的指针无影响。后者,即 char*& , 是将参数(字符串指针)的地址 再次强制转化成字符指针型, 这就有可能改变函数外指针指向的值,因为此指针已经不是传入字符串的指针了。

参考:c++ char* char*&的区别

 

 

亲情的三分
亲情的三分
嗯,我最后将两个地址打印出来。看了一下。char* 传入的值复制到另一个地址了
0
魔仙剑痴
第二个str指针把外部str的指针也向前移动一位了。
亲情的三分
亲情的三分
嗯,是的,第二个采用引用传值的方式,改变的是原始地址的内容; 但是使用char *传递的是复制的值;
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部