【C语言】指针进阶第四站:数组/指针的传参问题!

这篇博客介绍了C++中函数传参的细节,包括一维数组、二维数组以及指针的传递。重点讲解了数组作为参数时,形参可以使用数组或指针形式,并探讨了不同维度数组的传参规则,以及如何通过测试代码判断参数类型。强调了二维数组首元素的类型和正确接收方式。
摘要由CSDN通过智能技术生成

点击蓝字

8e0da2d847cc8b46c949bc7b593f3b71.png

关注我们

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

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*类型

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

738d0c65a21e7c958b5377cde8844592.png

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编译器会报错“类型不一致”

7181ea7c98b891b871579f2750e091a8.png

结语

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

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

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

*声明:本文于网络整理,版权归原作者所有,如来源信息有误或侵犯权益,请联系我们删除或授权事宜。

5b78983de3179c7bf6e1fcc61d64d7a9.png

c8497283f5822f81fc1e3f14b2797186.gif

戳“阅读原文”我们一起进步

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值