直接对函数进行值传递
值传递不能在函数内部改变外部变量的值
void setNum01(int data)
{
data = 100;
}
void test02()
{
int num = 0;
setNum01(num);// 如果不用指针 会遇到的问题
//
cout << num << endl;//0 如果是单向值传递,则修改不成功
}
为什么会出现这个现象,调用setNum01时会为形参 data开辟空间,实际上是 int data = num,所以修改的都是data,而不是num
直接对函数进行地址传递
如果想在函数内部 修改外部变量的值 需要将外部变量的地址 传递给函数
void setNum02(int *p)
{
// 这里相当于*p = &num
*p = 100;
}
void test03()
{
int num = 0;
setNum02(&num);
//
cout << num << endl;//100 如果靠指针传递,则修改成功
}
成功的原因,调用setNum02时,其形参p指向了num的第一个字节,因此p相当于去了num的值,修改的是num
当函数的输入是数组时
一维数组作为函数参数,会被编译器优化成指针变量!!!!
void outprint(int n, int *p)// 这个地方如果不是 int *p, 而是arr[5],其结果跟int *p 一样,因为编译器会被优化成指针变量
// void outprint(int n, int arr[5]) //上面和下面是一个意思
{
for(int i =0; i < n; i++)
cout << *(p+i) << endl;
}
void test04()
{
int arr[5] = {10,20,30,40,50};
int n = sizeof(arr)/sizeof(arr[0]);
outprint(n, arr);
}
同理,函数内部 想操作 函数外部的二维数组 需要将二维数组名 传递给函数
二维数组作为函数的形参,会被优化成 一维的数组指针。
void outprint2d(int (*p)[4],int row, int col)
{
for(int i = 0; i<row; i++)
{
for(int n=0; n<col;n++)
{
cout << *(*(p+i)+n) << endl;
}
}
}
void test05()
{
int arr[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};
int row = sizeof(arr)/sizeof(arr[0]);
int col = sizeof(arr[0])/sizeof(arr[0][0]);
outprint2d(arr,row,col);
}
函数的返回值位指针为类型
用处:将函数内部的合法地址通过返回值 返回给函数外部使用
注意:函数不要返回局部变量的地址
原因如下:
int *getAdd(void) // 注意返回值是int *
{
int data = 100;
return &data;// 不要返回局部变量地址
}
void test06()
{
int *p = NULL;
p = getAdd();
cout << "*p = " << *p<< endl;// 这种情况返回值是空的
}
原因是data在函数里开辟了空间,在函数返回后,这个空间被释放了,所以变成空的了,所以返回也是空