C和C++引用传递和数组传参引用
引用传递有两种传参方式,具体可参考文章
概括地讲,就是
*声明一个形参是指针,所以需要传递指针实参,对应的函数实现也应当遵循指针的语法。这种实现思路并不针对于C或者C++,因为它们都有指针,所以都可以通过指针来达到引用传参的效果,但是这种实现本质上不叫引用传参,因为传递的是指针,而不是实参的引用。
&这个操作符,在形参声明时,表示该形参是一个引用,不同于指针,也不是取地址操作符,该引用操作符属于C++的标准。函数被调用时,不会在内存中开辟新的空间,而是相当于给实参起了一个新名字,比如说如下代码中:
void fun(int &a){
a=2;
}
//调用fun函数
int num = 1;
fun(num);
在这个代码中,调用fun函数时,没有给a形参开辟内存空间,a实际上就是num变量的别名,a和num属于完全一样的存在。
参考链接:
https://stackoverflow.com/questions/57483/what-are-the-differences-between-a-pointer-variable-and-a-reference-variable-in
https://stackoverflow.com/questions/2229498/passing-by-reference-in-c
理解了指针传参和引用传参,再讲一下数组传参。
先思考一下,下面这段代码的输出
#include
using namespace std;
//通过数组名称传递
void fun1(int arr[]);
//通过指针传递
void fun2(int *arr);
int main() {
int arr[2] = {2,0};
fun1(arr);
for(int i=0; i<2; i++) {
cout<
int sizeofarr(int arr[]) {
printf("%d\n",sizeof(arr));
printf("%d\n",sizeof(arr[0]));
printf("%d\n",sizeof(int));
return sizeof(arr)/sizeof(int);
}
int main() {
int arr[10] = {2,0,9,3,2,1,2,5,6,7};
printf("size of arr calculating by parameter: %d",sizeofarr(arr));
printf("\n\n%d\n",sizeof(arr));
printf("%d\n",sizeof(arr[0]));
printf("%d\n",sizeof(int));
printf("the actual size of arr: %d",sizeof(arr)/sizeof(arr[0]));
return 0;
}
sizeof(arr)/sizeof(arr[0])这是一个十分常用的求数组长度的方法,前提是,不把arr传递到函数里面求长度,为什么这么说呢?参考如下打印结果:
截图_20191105031031.png
我的机子是64位的,所以sizeof(pointer)就是8,所以通过函数来求数组长度得到的结果就是2。
那么如何避免这种错误呢?
要么函数再加一个参数,表示数组的长度,要么定义一个全局的常量表示数组的长度。
参考链接:https://stackoverflow.com/a/10349610https://www.cnblogs.com/ericling/p/11798608.html