【C 语言】数组作为参数退化为指针问题 ( 问题描述 | 从编译器角度分析该问题 | 出于提高 C 语言执行效率角度考虑 | 数组作为参数的推荐方案 )
2023-06-13 09:17:59 时间
文章目录
一、问题描述
将 数组 作为 函数参数 , 传递时会 退化为指针 ;
数组的首地址 , 变为指针地址 , 函数中无法判定数组的大小 ;
代码示例 :
#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;
}
执行结果 :
相关文章
- SQL Server中的SQL语句优化与效率问题
- 优化MySQL 执行效率的优化技巧(mysql执行结果)
- MySQL数据库:使用可视化技术提高数据处理效率(mysql数据库可视化)
- Oracle值合并:从效率到高效解决方案(oracle值合并)
- 使用Oracle触发器类型提升数据库效率(oracle触发器类型)
- MySQL索引如何提高LIKE查询效率(mysql索引like)
- 提升Oracle数据库效率,优化你的业务运营(oracle效率优化)
- “提升Linux系统执行效率:设置超时时间”(linux设置超时)
- 优化MySQL分页效率优化:实现快速检索与分页(mysql分页效率)
- Oracle减少挑战:改善减法效率(oracle减法)
- 锁定Oracle存储过程:优化执行效率(oracle存储过程加锁)
- 提高开发效率,掌握MySQL数据库执行语句的技巧与方法(mysql数据库执行语句)
- 函数使用SQL Server窗口函数提高统计效率(sqlserver的窗口)
- SQL Server索引优化 提升性能与效率(sqlserver索引优化)
- Linux动态链接:提高程序的效率和可维护性(linux 动态 链接)
- 性能监控MySQL执行效率,提升运行效果(监控mysql执行)
- Linux实时任务调度:如何以更佳的效率执行(linux实时任务)
- 提升效率:用MySQL查看SQL代码的性能(mysql查看sql执行效率)
- Redis提升执行效率从队列开始(执行队列 redis)
- web开发拓展利用redis实现极致效率(web加redis)
- Oracle事件定时触发 优化系统运行效率(oracle事件定时执行)
- oracle 位图索引升级数据检索效率(oracle 位图链接)
- MySQL优化如何利用不等式索引提高查询效率(mysql 不等式 索引)
- 多线程并发执行Redis操作提升效率(多线程下执行redis)
- Redis提高通讯效率(redis 通讯 效率)
- 缩短利用Redis缓存加快执行效率(redis缓存执行时间)