C语言指针进阶第四站:数组/指针的传参问题!
Posted 一起学编程
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言指针进阶第四站:数组/指针的传参问题!相关的知识,希望对你有一定的参考价值。
朋友们,到站啦!指针进阶第四站:传参问题
0.引例
自定义函数里形参的类型,要和函数调用中传过去的实参类型相对应
test函数里的是int类型,我们传过去的参数a也是int类型
void test(int n)
int main()
int a=1
test(a);
return 0;
好了,现在你已经知道了函数传参的基本概念了吧!
那么就来分析一下数组传参、指针传参的代码吧!
1、一维数组传参
看看以下函数的代码示例
你觉得谁是正确的,谁是错误的呢?
include <stdio.h>
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 <stdio.h>
void print(int *p, int sz)//用int*来接受
int i = 0;
for(i=0; i<sz; i++)
printf("%d\\n", *(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 <stdio.h>
void test(int** ptr)
printf("num = %d\\n", **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!
第四站数组传参到这里就结束啦!
为了帮助大家,轻松,高效学习C语言/C++,给大家分享我收集的资源,从最零基础开始的,帮助大家在学习C语言的道路上披荆斩棘!
微信公众号:C语言编程学习基地
以上是关于C语言指针进阶第四站:数组/指针的传参问题!的主要内容,如果未能解决你的问题,请参考以下文章