C语言中只有值传递,也就是传递副本,指针传递的只是地址的副本
当然,如果你传递了一个指向某个变量的指针,而函数对该指针执行了间接访问操作,那么函数就可以改变那个变量,但参数还是传值方式传递的,这是两个概念,不矛盾。
而对于引用传递,表面上看不会产生一个副本,看下面的代码吧,不多多了
#include<iostream>
#include<string>
using namespace std;
//总结真正的理解值传递和指针传递,不是实参是指针变量,就代表是传指针,也是传值,因为都是
//传的变量,不管是指针变量,还是其他变量。
void testgetmemory(char *p)
{
printf("testgetmemory 指针 p addr is [%x], p's value is[%x],*p is %c\n", &p,p,*p);
*p = 'z';
}
void testgetmemory1(char &q)
{
printf("testgetmemory 引用 q addr is [%x] q is %c\n", &q, q);
q = 'z';
}
int main()
{
char w = 'c';
printf("w addr is [%x],w is %c\n", &w, w);
testgetmemory1(w);
testgetmemory(&w);
return 0;
}
输出的结果如下:
w addr is [3ef8f3],w is c
testgetmemory 引用 q addr is [3ef8f3] q is c
testgetmemory 指针 p addr is [3ef81c], p's value is[3ef8f3],*p is z
请按任意键继续. . .
现在看总结如下:
传递指针同样会产生一个副本
而传递引用确实没有副本,因为传毒引用的话,和之前的变量地址相同都是 3cf7df
而传递指针变量的时候 产生了一个副本指针变量,其地址已经不是3cf7df而是一个新的地址,3cf708
但是这个变量里面的内容是上面的地址。