我理解的char*和char*&区别

关于传值,传指针和传引用区别,我这里就不讲了,网上一搜就可以了。

我的疑问是,char*&的用处是什么?什么情况下用char*&.

我们知道,星号 * 代表一个内存地址,是一个数字 ,说明这个变量是个指针。

比如 char* c = "abcde";

c就是指针变量。是一个地址。比如0x0000011,还是个数字。

所以说,c存储的数据类型是数据的地址。我们传指针的时候,实际上也是值传递,一样有值复制,只不过这个值是存储数据的地址。传递的时候,重新分配了一个内存空间,这个空间存的也是存储数据地址的内存地址。

传引用本质没有任何实参的拷贝,传递的就是实际地址本身。

我们看下实际代码

#include <iostream>

void Func(char *ch);

void Func1(char *&ch);

void Func(char *ch) {
    printf("func: 十六进制地址 = %p\t十进制地址 = %ld\t 值=%ld\n", &ch, &ch, ch);
}

void Func1(char *&ch) {
    printf("func1: 十六进制地址 = %p\t十进制地址 = %ld\t 值=%ld\n", &ch, &ch, ch);
}

int main() {
    char *c = "abced";
    printf("main: 十六进制地址 = %p\t十进制地址 = %ld\t 值=%ld\n", &c, &c, c);
    Func(c);
    Func1(c);
    return 0;
}

运行结果

main: 十六进制地址 = 0x7ffeed342a60    十进制地址 = 140732878039648     值=4337700723
func: 十六进制地址 = 0x7ffeed342a38    十进制地址 = 140732878039608     值=4337700723
func1: 十六进制地址 = 0x7ffeed342a60    十进制地址 = 140732878039648     值=4337700723

居于此,我们可以得出结论,传指针的时候,如果修改指针指向的存储数据,是有效的,但是如果改变指针地址就无效了,因为函数内和函数外并不是同一个内存空间。

所以,这段代码是合法的

struct Obj {
    int a;
    int b;
};
void Change(Obj* obj) {
    obj->a = 1;
}

但是这种改变本身地址不合法

void Change(char* ch) {
    ch = (char *) malloc(10);
}

T*&,因为是指针别名,所以我们可以在函数内改变指针指向,适合对于未知大小指针传递,比如:

size_t Proc(char*& ch) {
    char buff[1024];
    int n = (int) recv(fd,  buff, 10, 0);
    ch = (char*)malloc(n);
    memcpy(ch,buff,n);
    return n;
}
int main() {
    char* cc = nullptr;
    Proc(cc);

    return 0;
}