文章目录

  • 一、问题描述
  • 二、从编译器角度分析该问题
  • 三、数组作为参数的推荐方案

一、问题描述


将 数组 作为 函数参数 , 传递时会 退化为指针 ;

数组的首地址 , 变为指针地址 , 函数中无法判定数组的大小 ;

代码示例 :

#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 语言执行效率角度考虑 | 数组作为参数的推荐方案 )相关推荐

  1. 数组作为函数的参数传参时,数组名会退化为指针

    1.数组作为函数的参数传参时,数组名会退化为指针 数组作为函数的参数传参时,数组名会退化为指针,数值传参时,需要把数值的长度一起传过去,另外,sizeof()运算符包含字符串的哨兵'/0',而strl ...

  2. 【C语言进阶深度学习记录】三十一 数组作为函数参数时退化为指针

    之前的学习数组的文章中,已经知道一维数组作为函数参数的时候,最终会被编译器编译为指针.今天来看看二维数组的情形 文章目录 1 为什么C语言中的数组作为函数参数会退化为指针? 2 二维数组作为函数参数如 ...

  3. 【C 语言】数组 ( 多维数组做函数形参退化为指针过程 | int array[2][3] -> int array[][3] -> int (*array)[3] )

    文章目录 一.多维数组做函数形参退化为指针过程 1.使用 int array[2][3] 作函数参数 2.使用 int array[][3] 作函数参数 3.使用 int (*array)[3] 作函 ...

  4. C语言程序设计 | 指针(二):常量指针和指针常量、数组参数和指针参数、函数指针数组

    指针的进阶(二)目录: 常量指针和指针常量 数组参数和指针参数 函数指针数组 常量指针和指针常量 在我们日常中,经常会用到一个关键字const const是一个C语言(ANSI C)的关键字,具有着举 ...

  5. C语言多维数组做函数参数会退化,数组做函数参数退化问题

    一.数组做函数参数退化问题 数组做函数参数时,会退化为指针. 1.把数组的内存首地址和数组的有效长度传入函数. 2.实参数组和函数参数数组的数据类型不一样.形参中的数组,编译器会把它当做一个指针处理, ...

  6. C语言多维数组做函数参数退化原因大剖析

    多维数组做函数参数退化原因 多维数组做函数参数退化原因大剖析 多维数组做函数参数退化原因大剖析 //证明一下多维数组的线性存储 //线性打印 void printfArray411(int *arra ...

  7. C语言-数组名真的不是指针

    文章目录 1 前言 2 关于一维数组 3 sizeof运算符和自增运算符 4 数组名也不是常量指针 5 总结 1 前言 参照我之前的两篇文章: 二维数组做函数的参数 动态创建二维数组 事实告诉我们,二 ...

  8. python中的记录指针_使用Python向C语言的链接库传递数组、结构体、指针类型的数据...

    使用python向C语言的链接库传递数组.结构体.指针类型的数据 由于最近的项目频繁使用python调用同事的C语言代码,在调用过程中踩了很多坑,一点一点写出来供大家参考,我们仍然是使用ctypes来 ...

  9. 从编译器角度分析C语言中数组名和指针的区别

    从编译器角度分析C语言中数组名和指针的区别 数组名和指针是两个往往很容易让人们混淆的概念,很多人以为数组名就是一个指针,也有很多人知道数组名不同于指针但是仅知道数组名的值不能像指针一样改变. 例如你可 ...

最新文章

  1. 试用去水印_教你一键视频去水印,支持抖音、快手、小红书、哔哩哔哩等几十个平台...
  2. GNU源码安装借用YUM排除故障
  3. python写word模板_Python3操作Office之Word模板技术
  4. python中pop(),popitem()的整理
  5. Bind服务简单应用之一(介绍)
  6. 《如何让你爱的人爱上你》第一部分:第一印象
  7. 【Linux】Linux系统学习
  8. Skills | word批量修改图片为统一大小
  9. 蓝桥杯 PREV-10 幸运数
  10. win10 安装 hadoop 3.3.1报错 Unable to load native-hadoop library
  11. DRAM内存原理(四)同步内存和异步内存技术
  12. 无侵入式的mysql的binlog采集——maxwell采集binlog放到kafka中——成功!
  13. js打折 (批量计算9折 8折 7折
  14. The root link base_link has an inertia specified in the URDF, but KDL does not support a root ...
  15. (项目)审计系统(堡垒机)
  16. DTM使用途中的bug记录
  17. 光学变焦----景深=景深远界-景深近界
  18. 算法导论之排序算法(1)
  19. IT十年人生过客-十一-新挑战
  20. LeetCode刷题笔记 - 175.Combine Two Tables

热门文章

  1. 太相信书的人,格局不会太大
  2. 现实世界的Windows Azure:采访Figlo的全球合作伙伴支持经理Nathan Brouwer
  3. JavaScript面向对象(一)——JS OOP基础与JS 中This指向详解
  4. Linux(Ubuntu 16) 下Java开发环境的配置(一)------JDK的配置
  5. 导航选中后标记的样式实现滑动效果
  6. 编写高质量代码改善C#程序的157个建议——建议87:区分WPF和WinForm的线程模型...
  7. TCP/UDP编程中的问题汇总
  8. keil c51的内部RAM(idata)动态内存管理程序(转)
  9. undefined reference to 'pthread_mutex_trylock'
  10. Android 使用GridView+仿微信图片上传功能(附源代码)