数组的指针、引用传参
#include <iostream>
void f1(int a[])
{
printf("%p %d\n", a, sizeof(a));
}
void f2(int a[4])
{
printf("%p %d\n", a, sizeof(a));
}
void f3(int (&a)[4])
{
printf("%p %d\n", a, sizeof(a));
}
int main()
{
int a[4];
f1(a); //012FF9BC 4
f2(a); //012FF9BC 4
f3(a); //012FF9BC 16
return 0;
}
上面就是一个简单的例子,第三个函数由于传进去的是数组的引用,所以可以判断出a的内存大小是16个字节,前两个函数只能判断出a是一个地址,判断出来的的都是a这个指针所占内存的大小,指针所占内存大小一般都是4或者8个字节,取决于系统内存最大寻址大小,即32位操作系统一般指针为4个字节,64位操作系统一般指针为8个字节。
指针和引用的区别
引用是别名,指针是地址。
1、引用必须被初始化,指针可以不被初始化。
2、引用必须绑定,指针可以不指向任何地址。
3、指针和引用的自增自减运算意义不一样(对引用本身进行操作将反馈到引用的值上,对指针本身的操作只是改变了指针的值,对指针指向的地址的值没有影响)。
4、"sizeof引用"得到的是所指向的变量(对象)所占内存的大小,而"sizeof指针"得到的是指针本身所占内存的大小。
const与指针
int a = 4;
const int* p1 = &a;
int const* p2 = &a;
int* const p3 = &a;
const int* const p4 = &a;
p1和p2是一样的,表示不可通过该指针改变该指针指向的内存地址对象的值。
p3则是表示指针本身的值不可被改变,即不能再指向别的变量。
p4则既不可通过该指针改变该指针指向的内存地址对象的值,也不能再指向别的变量。
返回引用、右值引用
引用和const引用传递返回的都是栈里面变量的地址,右值引用返回后会创建一片新的内存。
#include <iostream>
#include <cstdio>
using namespace std;
int fun1()
{
int a = 10;
printf("fun1 %d %p\n", a, &a);
return a;
}
int& fun2()
{
int a = 10;
printf("fun2 %d %p\n", a, &a);
return a;
}
const int& fun3()
{
int a = 10;
printf("fun3 %d %p\n", a, &a);
return a;
}
int main()
{
int a1 = fun1();
++a1;
printf("main %d %p\n", a1, &a1);
int& a2 = fun2();
++a2;
printf("main %d %p\n", a2, &a2);
const int& a3 = fun3();
a3;
printf("main %d %p\n", a3, &a3);
int&& a4 = fun1();
++a4;
printf("main %d %p\n", a4, &a4);
return 0;
}
fun1 10 006FFA08
main 11 006FFB1C
fun2 10 006FFA08
main 11 006FFA08
fun3 10 006FFA08
main 10 006FFA08
fun1 10 006FFA08
main 11 006FFAEC