C 语言数组作为参数退化为指针问题 ( 问题描述 | 从编译器角度分析该问题 | 出于提高 C 语言执行效率角度考虑 | 数组作为参数的推荐方案 )
Posted 韩曙亮
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C 语言数组作为参数退化为指针问题 ( 问题描述 | 从编译器角度分析该问题 | 出于提高 C 语言执行效率角度考虑 | 数组作为参数的推荐方案 )相关的知识,希望对你有一定的参考价值。
一、问题描述
将 数组 作为 函数参数 , 传递时会 退化为指针 ;
数组的首地址 , 变为指针地址 , 函数中无法判定数组的大小 ;
代码示例 :
#include <stdio.h>
/*
* 数组作为参数 会 退化为指针
*/
void fun(int array[3])
printf("fun : sizeof(array)=%d\\n", sizeof(array));
/*
* 函数入口
*/
int main(int argc, char **args)
// 将要作为实参的数组
int array[3] = 1, 2, 3;
printf("main : sizeof(array)=%d\\n", sizeof(array));
// 将数组作为参数传递到函数中
fun(array);
return 0;
执行结果 :
二、从编译器角度分析该问题
该问题的理解 , 需要从 C/C++ 编译器的角度进行理解 , 代码开发出来 , 主要是给编译器使用的 , 让编译器明白开发者的意图 ;
上述示例中 , 函数的 实参是
// 将要作为实参的数组
int array[3] = 1, 2, 3;
, 其类型是 int 数组 ; 函数的 形参是 void fun(int array[3])
中的
int array[3]
其类型是指针 ;
上述 实参的 array 与 形参的 array 数据类型不同 ,
编译器将 形参的 array 当做指针 , 只给该形参分配了 4 字节内存 , 没有为其分配 4 x 3 = 12 字节的内存 ;
编译器会将 形参中的数组 作为指针处理 , 只会为其分配 指针 所占用的内存 ;
如果 编译器 将 形参作为 数组处理 , 需要 将数组中的所有元素 , 都要拷贝到栈中 , 如果这个数组很大 , 有几千上万个元素 , 那么该函数的执行效率就很低了 ;
因此 , 为了提升 C 语言的执行效率 , 参数传递时 , 如果要传递大量数据 , 不允许传递数组 , 只能传递指针 ;
C 语言的优势 , 就是在 调用函数 之间 , 通过指针操作内存 , 效率很高 , 因此 编译器不允许使用数组作为参数 ;
三、数组作为参数的推荐方案
形参设置为 数组元素类型的指针 , 以及数组元素个数 ;
代码示例 :
#include <stdio.h>
/*
* 数组作为参数 会 退化为指针
*/
void fun(int *array, int count)
int i;
for(i = 0; i < count; i++)
printf("%d ", array[i]);
/*
* 函数入口
*/
int main(int argc, char **args)
// 将要作为实参的数组
int array[3] = 1, 2, 3;
printf("main : sizeof(array)=%d\\n", sizeof(array));
// 将数组作为参数传递到函数中
fun(array, sizeof (array) / sizeof (array[0]));
return 0;
执行结果 :
以上是关于C 语言数组作为参数退化为指针问题 ( 问题描述 | 从编译器角度分析该问题 | 出于提高 C 语言执行效率角度考虑 | 数组作为参数的推荐方案 )的主要内容,如果未能解决你的问题,请参考以下文章
C 语言数组 ( 一维数组形参退化 | 二维数组形参退化 | 函数形参等价关系 )
C 语言数组 ( 指针退化验证 | 计算数组大小 | #define LENGTH(array) (sizeof(array) / sizeof(*array)) )