关于传值,传指针和传引用区别,我这里就不讲了,网上一搜就可以了。
我的疑问是,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;
}