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语言指针进阶第四站:数组/指针的传参问题!的主要内容,如果未能解决你的问题,请参考以下文章

c语言 指针传参

C语言进阶笔记深入了解进阶指针

C语言进阶笔记深入了解进阶指针

C语言进阶笔记深入了解进阶指针

C语言进阶笔记深入了解进阶指针

梦开始的地方 —— C语言指针进阶