函数的指针参数
两种参数传递的方法:一种值传递,一种是地址传递,值传递形参改变不改变实参的值,形参所占的内存空间和实参不一样。
int swap(int nuum1,int num2)
{
num1^=num2;
num2*=num1;
num1^=num2;
}
int main()
{
int a=10;int b=20;
swap(a,b);
}
a | 10 |
b | 20 |
int num1 | 10 |
int num2 | 20 |
所以值传递时并不会改变形参,但是指针传递时,传入的是地址,所以会改变实参
int swap(int *p1,int *p2)
{
(*p1)^=(*p2);
(*p2)*=(*p1);
(*p1)^=(*p2);
}
int main()
{
int a=10;int b=20;
swap(&a,&b);
}
a | 10 | 0x0001 |
b | 20 | 0x0002 |
int *p1 | 0x0001 | |
int *p2 | 0x0002 |
这里*p1相当于*0x0001,就是取a的地址,所以直接修改了实参的值
函数的数组参数
像这种,如果想要传递数组进去,不能 传递a[3]这种方式
int add(int a[3])
{
std::cout<<sizeof(a[3]);
return 0;
}
int main()
{
int a[3] {1,2,3};
add(a[3]);
}
因为不知道要数组的元素个数,可能是2个,也可能是3个所以推荐用下面这种方法。另外,如果传入a【3】,编译器不会知道这是数组还是指针类型,因为a【3】实际上一个指针,另外假如,假如不把数组当成指针,那么不同长度的数组就是不同的类型,a【2】和a【3】类型都不同,如果把a[3]作为形参,传入不同长度的数组都需要不同的函数
数组有一种声明方式是不写下标,由编译器判断数组的容量大小
int a[] {1,2,3};
所以数组的参数传递可以这样写,count表示数组元素个数
add(int a[],unsigned count)
当然,也可以用指针方式来传递,因为数组本身就是指针
多维数组的参数传递
必须指定低维的数组元素个数
add(int a[][2],unsigned count);
int main()
{
a[2][2] {{1,2},{2,3}};
add(a,2);
}
因为多维数组是以低维为步径,如果低维也用变量,就无法确定步径。
函数的引用参数
引用做函数参数时必须初始化,所有有时候用指针还是用引用做参数可以从这方面考虑
指针的引用,形参指针引用可以修改实参指针的指向,即指针的引用可以修改指针,原理非常简单
引用参数类型必须一样
void swap(int& a)
{
a = 200;
}
int main()
{
float p{ 100 };
swap(p);
std::cout << p;
}
这个程序就是错误的,必须让p为int类型才可以,因为别名类型必须和原名类型相同