数组/指针的传参问题

描述

朋友们,到站啦!指针进阶第四站:传参问题

0.引例

自定义函数里形参的类型,要和函数调用中传过去的实参类型相对应

test函数里的是int类型,我们传过去的参数a也是int类型

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
void test(int n){}int main(){    int a=1    test(a);    return 0;}

好了,现在你已经知道了函数传参的基本概念了吧!

那么就来分析一下数组传参、指针传参的代码吧!

 

1、一维数组传参

看看以下函数的代码示例

你觉得谁是正确的,谁是错误的呢?

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
include void test(int arr[]){}void test(int arr[10]){}void test(int *arr){}void test2(int *arr[20]){}void test2(int **arr){}int main(){    int arr[10] = {0};    int *arr2[20] = {0};    test(arr);    test2(arr2);    return 0;}

NO.1 形参使用数组的形式来接收,正确

NO.2 同样是数组的形式,正确

需要注意的是,数组传参并不会开辟一个新的数组

所以函数[ ]里的数字是多少并不影响

NO.3 数组名是首元素的地址,用指针接收,正确

NO.4 arr2是一个指针数组,(int *arr[20])和原数组对应,正确

NO.5 数组名是首元素地址,arr2的首元素是一个int*类型

可以用二级指针来接收,正确!

代码

2、二维数组传参

了解完一维数组了,那就来看看二维数组

以下的函数传参,哪些是对的,哪些是错的呢?

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
void test(int arr[3][5])//一一对应,正确!{}void test(int arr[][])//省略列,错误!{}void test(int arr[][5])//可以省略行,正确!{}void test(int *arr)//二维数组的首元素是第一行{}//第一行是int(*)[5]类型,错误!void test(int* arr[5])//指针数组,错误!{}void test(int (*arr)[5])//数组指针,正确!{}void test(int **arr)//arr不是一级指针的地址,错误!{}
int main(){    int arr[3][5] = {0};    test(arr);    return 0;}

根据二维数组传参的代码,复习以下知识点

(1)二维数组的首元素是第一行

(2)二维数组在定义的时候可以省略行,不能省略列

第一行的类型是int[5],应该放进 数组指针里!

 

3、一级指针传参

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
#include void print(int *p, int sz)//用int*来接受{ int i = 0; for(i=0; i { printf("%d
", *(p+i)); }}int main(){ int arr[10] = {1,2,3,4,5,6,7,8,9}; int *p = arr; int sz = sizeof(arr)/sizeof(arr[0]);  print(p, sz);//一级指针p,传给函数 return 0;}

4、二级指针传参

以下是二级指针传参的基本形式

pp是int**类型,而&p是指针变量的地址,要用二级指针来接收

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
#include void test(int** ptr){  printf("num = %d
", **ptr); }int main(){  int n = 10;  int*p = &n;  int **pp = &p;  test(pp);  test(&p);  return 0;}

再来看如下代码

&p、pp、arr这三个参数的类型都是二级指针

test函数里面要用char**来接收

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
void test(char** p){}
int main(){  char ch = 'w';  char* p = &ch;  char** pp = &p;  char* arr[5];
  test(&p);  test(pp);  test(arr);    return 0;}

arr是指针数组的数组名,数组名是数组首元素的地址

数组的首元素是char*类型,所以要用二级指针来接收

 

5、如何判断参数类型

如果我们在写代码的时候,不缺定应该用什么类型来接收的时候

可以写一个测试代码,VS编译器会报错“类型不一致”

代码

结语

传参问题并不算非常难,但我们仍要熟练掌握

这样才能避免在写自定义函数的时候出现参数类型不同的bug!

第四站数组传参到这里就结束啦!

  审核编辑:汤梓红


打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分