4步讲解一维数组传参与二维数组传参

简介: 4步讲解一维数组传参与二维数组传参

1.一维数组传参:  形参可以是数组也可以是指针!


#include <stdio.h>
int main()
{
  void test1(int arr[])
  { }
  void test2(int arr[10])
  { }
}

对于上述代码中,传递的形参为数组!对于test1, test2 中的数组大小可以省略!数组传参时,不会传递整个数组!因此对于数组的大小,在形参里面随便写,这个值是不会使用的!(但是建议不要随便写!万一……得不偿失!)


#include <stdio.h>
int main()
{
  void test3(int* arr)        //形参为指针
  { }
  void test4(int* arr[20])   //形参为数组
  { }   //arr[20],中的20可以省略!
  void test5(int** arr)     //形参为指针
  { }
}

对于上述代码段形参,显得残次不齐!请读者仔细思考一下!


int arr[10] = { 0 };
test(arr);
int* arr2[20] = { 0 };
test(arr2);

对于上述代码,笔者所讲述了,如何将数组当作指针来进行传参(数组传参时候,本质上传递的是地址)!!


对于: int* arr2[20] = { 0 }; 部分,arr 2是用来存放指针数组的(一维数组,存放整型指针的数组)


对于arr2[20]的类型解析:


0a2653c851af460fa595bd959398a8f1.png


显而易见的对于arr2[20]:存放了20个int *  类型的整型指针!!


2:二维数组传参的书写规范指正!


对于二维数组大多刚刚对于指针入门的读者而言,二维数组传参时候的书写规范,目前并没有系统的了解!所以笔者下面来带领大家走进对二维数组的传参书写规范!加深了解与认识!


对于二维数组传参时候,形参可以是数组,也可以是指针!!


对于形参是数组部分:


void test1(int arr[3][5])   //正确
  { }
  void test2(int arr[][])    //错误写法
  { }
  void test3(int arr[][5])    //正确
  { }

上述代码中,test1与test3都是正确的写法!对于数组的行与列部分:行可以省略,列不能省略!对于test2是个严重错误的典范,严重不可取!!需要注意的是:test3里面的arr[][5],列的5需要与实参的数值相对应!!


对于形参是数组部分:


void test4(int* arr)      //错误写法
  { }
  void test5(int* arr[5])   //错误写法
  { }
  void test6(int(*arr)[5])   //正确
  { }
  void test7(int** arr)      //错误写法
  { }

对于上述代码中,只有test6是正确的写法,其他都是错误的写法!


对于:void test7(int** arr)   书写的是二级指针,但需要强调的是二级指针是用来接收一级指针变量的地址!而不是二维数组!


#include <stdio.h>
int main()
{
  int arr[3][5] = { 0 };
  tets(arr);  //数组名是数组首元素的地址!——》二维数组第一行的地址!
     //实参传递的是二维数组的数组名,因此需要用上面讲解的书写规范来使用……
}

3.一级指针传参!


对于一级指针传参,想必到目前为止,大家已经有着详细的了解,所以笔者就不做过多的讲解!仅仅代码一篇,供大家思考!


#include <stdio.h>
void print(int* p, int sz)   //一级指针传参,一级指针接收!
{
  int i = 0;
  for (i = 0; i < sz; i++)
  {
  printf("%d ", *(p + i));
  }
  printf("\n");
}
int main()
{
  int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
  int* p = arr;
  int sz = sizeof(arr) / sizeof(arr[0]);
  print(p, sz);
  //一级指针p,作为实参传递给形参!
  return 0;
}

代码的运行结果为:


6de278e6d6694ce5bb08e7e842b7e74b.png


思考一下:


当一个函数的参数部分为一级指针的时候,函数能接收什么参数???


void test(int* p)  //一级指针接收
{ }
int main()
{
  int a = 0;  
  test(&a);  //方法1
  int a = 0;
  int* ptr = &a;
  test(ptr);    //方法2
  int arr[10] = { 0 };
  test(arr);  //方法3
}


因此有着上述三种方法来实现:一个函数部分为一级指针的时候,实参的传递方法!


4.二级指针传参


对于二级指针传参,跟一级指针一样,想必到目前为止,大家已经有着详细的了解,所以笔者就不做过多的讲解!仅仅代码一篇,供大家思考!


#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;
}

代码的运行结果为:


0a2653c851af460fa595bd959398a8f1.png


下面疑问接着而来!


当一个函数的参数部分为二级指针的时候,函数能接收什么参数???


参考思考部分:


void test(int** p)
{ }
int main()
{
  int** ptr;
  test(ptr);  //方法1
  int* p2;
  test(&p2);  //方法2
  int* arr[10];
  test(arr);   //方法3
}

笔者目前所知道的有着上述三种方法来实现:一个函数部分为二级指针的时候,实参的传递方法!


此篇博客到此就已经结束,耗时接近三小时打磨而来,请读者……一键三连呀!!!


相关文章
|
6月前
|
存储 C语言 索引
指针详解(const、指针运算、数组名的理解、传址调用和传值调用、一维数组的本质​)(一)
指针详解(const、指针运算、数组名的理解、传址调用和传值调用、一维数组的本质​)(一)
|
11月前
二维数组传参的本质
二维数组传参的本质
35 0
二维数组传参的本质
|
11月前
一维数组传参的本质
一维数组传参的本质
47 0
|
存储 小程序 编译器
数组传参不理解?(数组传参的本质)
数组传参不理解?(数组传参的本质)
102 0
|
存储 索引
函数与数组
函数(function),数学术语。其定义通常分为传统定义和近代定义,函数的两个定义本质是相同的,只是叙述概念的出发点不同,传统定义是从运动变化的观点出发,而近代定义是从集合、映射的观点出发。
|
存储 C语言
【C语言】 数组:-- 一维数组 -- 二维数组 -- 数组越界 -- 数组作为函数的参数2
【C语言】 数组:-- 一维数组 -- 二维数组 -- 数组越界 -- 数组作为函数的参数2
|
C语言
【C语言】 数组:-- 一维数组 -- 二维数组 -- 数组越界 -- 数组作为函数的参数4
【C语言】 数组:-- 一维数组 -- 二维数组 -- 数组越界 -- 数组作为函数的参数4
|
存储 编译器 程序员
【C语言】 数组:-- 一维数组 -- 二维数组 -- 数组越界 -- 数组作为函数的参数3
【C语言】 数组:-- 一维数组 -- 二维数组 -- 数组越界 -- 数组作为函数的参数3
|
存储 编译器 C语言
【C语言】 数组:-- 一维数组 -- 二维数组 -- 数组越界 -- 数组作为函数的参数1
【C语言】 数组:-- 一维数组 -- 二维数组 -- 数组越界 -- 数组作为函数的参数1
数组作为函数参数传参&数组名到底代表什么意义?
数组作为函数参数传参&数组名到底代表什么意义?