【C 语言】数组 ( 一维数组形参退化 | 二维数组形参退化 | 函数形参等价关系 )

举报
韩曙亮 发表于 2022/01/12 22:29:20 2022/01/12
【摘要】 文章目录 一、一维数组形参退化二、二维数组形参退化三、数组形参等价关系 一、一维数组形参退化 C 中将 一维数组 作为参数 , 传递到函数中 , 该 一维数组 会退...





一、一维数组形参退化



C 中将 一维数组 作为参数 , 传递到函数中 , 该 一维数组 会退化为 指针 ;

int array[10]

  
 
  • 1

数组 , 作为参数 , 传递到函数中 ,

void fun(int array[1000]){}

  
 
  • 1

void fun(int *array){}

  
 
  • 1

是等价的 , 函数中处理 array 数组时 , 不知道该数组的元素个数 , 编译器只能确认 , 该参数是一个 int * 指针类型 ;


这样操作是为了提高 编译器 的效率 , 提高程序执行的效率 , 函数的 形参 最终要拷贝到 栈内存 中 ,

  • 如果将整个数组作为形参 , 需要拷贝整个数组的内容 , 如果数组有 1000 1000 1000 个元素 , 需要拷贝 4000 4000 4000 字节 , 这样效率就很低了 ;
  • 如果只需要拷贝数组地址 , 这个地址存放在指针变量中 , 只需要传递 4 4 4 字节就可以了 ;

一维数组 形参 退化路径 :

  • int array[1000]
void fun(int array[1000])
{
}

  
 
  • 1
  • 2
  • 3
  • int array[]
void fun(int array[])
{
}

  
 
  • 1
  • 2
  • 3
  • int *array
void fun(int *array)
{
}

  
 
  • 1
  • 2
  • 3




二、二维数组形参退化



二维数组 作为 函数形参 , 也会退化为指针 ;


二维数组 看作 一维数组 ,

  • 一维数组 中每个元素是 实际的数据 ,
  • 二维数组 中每个元素是 一维数组 ;

一维数组 退化时 , 退化为 指向 一维数组元素指针 ;

二维数组 退化时 , 退化为 指向 二维数组元素指针 , 这个 二维数组元素 就是 一维数组 , 也就是退化为 指向 一维数组的指针 ;

特别注意 , 二维数组 退化的 指针 , 指向的 一维数组 是有效的 , 可以得到数组的元素个数 , 是一个正式的数组 ;


二维数组 形参 退化路径 :

  • int array[10][20]
void fun(int array[10][20])
{
}

  
 
  • 1
  • 2
  • 3
  • int array[][20]
void fun(int array[][20])
{
}

  
 
  • 1
  • 2
  • 3
  • int (*array)[20] : 此处注意 , 数组指针 指向的 一维数组 是完整的数组 ;
void fun(int (*array)[20])
{
}

  
 
  • 1
  • 2
  • 3




三、数组形参等价关系



实参为 一维数组 int array[10] , 等效的 形参为 一级指针 int *array ;

  • 一维数组 , 直接退化为 指向 数组元素的指针 , 数组元素是 普通类型 , 指向普通类型的指针 , 即 一级指针 ;

实参为 指针数组 int *array[10] , 等效的 形参为 一级指针 int **array ;

  • 指针数组 是 数组的元素 都是 指针变量 ;
  • 数组退化为 指针 , 指针指向的元素 也是 指针 , 则形参为 二级指针 ;

实参为 二维数组 int array[10][20] , 等效的 形参为 一级指针 int (*array)[20] ;

  • 二维数组 的 数组的元素 是 一维数组 ;
  • 外围数组 ( 第二维 ) 退化为 指针 , 指针 指向的元素 是 一维数组 , 则形参为 指向 一维数组 的指针 , 每个一维数组有 20 20 20 个元素 ;

文章来源: hanshuliang.blog.csdn.net,作者:韩曙亮,版权归原作者所有,如需转载,请联系作者。

原文链接:hanshuliang.blog.csdn.net/article/details/121637890

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。