参数的传递本质上是一次赋值的过程,赋值就是对内存进行拷贝。所谓内存拷贝,是指将一块内存上的数据复制到另一块内存上。
对于像 char、bool、int、float 等基本类型的数据,它们占用的内存往往只有几个字节,对它们进行内存拷贝非常快速。而数组、结构体、对象是一系列数据的集合,数据的数量没有限制,可能很少,也可能成千上万,对它们进行频繁的内存拷贝可能会消耗很多时间,拖慢程序的执行效率。
C/C++ 禁止在函数调用时直接传递数组的内容,而是强制传递数组指针。而对于结构体和对象没有这种限制,调用函数时既可以传递指针,也可以直接传递内容;为了提高效率,建议传递指针。
引用(Reference)是 C++ 相对于 C 语言的又一个扩充。引用可以看做是数据的一个别名,通过这个别名和原来的名字都能够找到这份数据。
引用的定义方式类似于指针,只是用&取代了*,语法格式为:
type &name = data;
type 是被引用的数据的类型,name 是引用的名称,data 是被引用的数据。引用必须在定义的同时初始化,并且以后也要从一而终,不能再引用其它数据,这有点类似于常量(const 变量)。
int a = 99;
int b =a;
int &r = a;
cout<<a<<", "<<b<<", "<<r<<endl;
cout<<&a<<", "<<&b<<", "<<&r<<endl;;
//99, 99, 99
//0x7ffeefbff54c, 0x7ffeefbff548, 0x7ffeefbff54c
可以看出不同于b变量的新地址,&r使用了和a一样的地址,r和a内容也一样。
&r
表示r
变量自己没有内存,而是直接指向a
的内存地址。r
和a
内容一样,&r
和&a
地址一样。
int a2 = 99;
int *r2 = &a2;
*r2 = 18;
cout<<r2<<", "<<*r2<<", "<<a2<<endl;
//0x7ffeefbff53c, 18, 18
int *
和&a2
都是地址,才能赋值,int *r2=a2
会报错。所以r2
的内容表示a2
的地址,*r2
表示a2
的值。
网友评论