0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

数组/指针的传参问题

C语言编程学习基地 来源:C语言编程学习基地 作者:C语言编程学习基地 2022-08-17 10:37 次阅读

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

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

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

860bcc2e-1d3a-11ed-ba43-dac502259ad0.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 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编译器会报错“类型不一致”

864c6108-1d3a-11ed-ba43-dac502259ad0.png

结语

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

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

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

审核编辑:汤梓红


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

    关注

    1

    文章

    480

    浏览量

    70560
  • 代码
    +关注

    关注

    30

    文章

    4787

    浏览量

    68569
  • 数组
    +关注

    关注

    1

    文章

    417

    浏览量

    25943

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

文章出处:【微信号:cyuyanxuexi,微信公众号:C语言编程学习基地】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    C语言中指针数组数组指针的区别

    指针数组之间存在着紧密的关系。在本文中,我们将探讨指针数组的关系、指针算术和数组遍历、多维
    发表于 08-17 15:29 412次阅读

    数组指针的详细讲解

    数组指针的详细讲解
    发表于 10-16 08:44 0次下载

    指针数组的详细资料和实例程序免费下载

    指针变量来访问数组中任一元素,通常将数组的首地址称为数组指针,而将指向数组元素的
    发表于 11-05 17:07 4次下载
    <b class='flag-5'>指针</b>与<b class='flag-5'>数组</b>的详细资料和实例程序免费下载

    详谈数组指针的区别与联系

    详谈数组指针的区别与联系
    的头像 发表于 06-29 15:18 2.2w次阅读
    详谈<b class='flag-5'>数组</b>和<b class='flag-5'>指针</b>的区别与联系

    指针数组数组指针的区别

    这里我们区分两个重要的概念:指针数组数组指针
    的头像 发表于 06-29 15:30 2w次阅读
    <b class='flag-5'>指针</b><b class='flag-5'>数组</b>和<b class='flag-5'>数组</b><b class='flag-5'>指针</b>的区别

    图文详解:数组指针

    数组时,会退化为指针,所以我们先来看看什么是退化!
    的头像 发表于 06-29 15:34 5418次阅读
    图文详解:<b class='flag-5'>数组</b>和<b class='flag-5'>指针</b>的<b class='flag-5'>传</b><b class='flag-5'>参</b>

    理解函数指针、函数指针数组、函数指针数组指针

    理解函数指针、函数指针数组、函数指针数组指针
    的头像 发表于 06-29 15:38 1.5w次阅读
    理解函数<b class='flag-5'>指针</b>、函数<b class='flag-5'>指针</b><b class='flag-5'>数组</b>、函数<b class='flag-5'>指针</b><b class='flag-5'>数组</b>的<b class='flag-5'>指针</b>

    C语言总结_数组与函数练习题

    字符串标准处理函数介绍(string.h)、指针数组当做函数形指针定义、函数返回指针、void类型定义
    的头像 发表于 08-14 09:36 830次阅读

    二维数组数组指针以及指针数组

    二维数组数组指针以及指针数组
    的头像 发表于 08-16 09:02 2668次阅读

    【C语言进阶】“数组指针”和“指针数组”都是啥跟啥?

    【C语言进阶】“数组指针”和“指针数组”都是啥跟啥?
    的头像 发表于 08-31 13:21 1915次阅读

    C语言数组元素的指针

    C语言调用函数时虚实结合的方法都是采用“值传递”方式,当用变量名作为函数参数时传递的是变量的值,当用数组名作为函数参数时。 由于数组名代表的是数组元素地址,因此传递的值是地址,所以要去形
    的头像 发表于 03-10 14:45 907次阅读

    C语言中什么是指针数组

    在C语言中一个数组,若其元素均为指针类型数据,称为指针数组,也就是说,指针数组中的每一个元素都存
    的头像 发表于 03-10 15:26 1769次阅读

    数组指针不能混用的情况

    数组指针不能混用的情况  数组指针是 C/C++ 中非常常见的特性和概念。然而,在某些情况下,数组
    的头像 发表于 12-07 13:46 609次阅读

    数组指针不相同吗?数组指针有哪些区别

    数组就是指针指针就是数组,这样的言论在评论区看到不下于10次。
    的头像 发表于 12-13 16:34 1511次阅读
    <b class='flag-5'>数组</b>和<b class='flag-5'>指针</b>不相同吗?<b class='flag-5'>数组</b>和<b class='flag-5'>指针</b>有哪些区别

    面试常考+1:函数指针指针函数、数组指针指针数组

    在嵌入式开发领域,函数指针指针函数、数组指针指针数组是一些非常重要但又容易混淆的概念。理解它
    的头像 发表于 08-10 08:11 853次阅读
    面试常考+1:函数<b class='flag-5'>指针</b>与<b class='flag-5'>指针</b>函数、<b class='flag-5'>数组</b><b class='flag-5'>指针</b>与<b class='flag-5'>指针</b><b class='flag-5'>数组</b>