IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 【C 语言】数组作为参数退化为指针问题 ( 问题描述 | 从编译器角度分析该问题 | 出于提高 C 语言执行效率角度考虑 | 数组作为参数的推荐方案 ) -> 正文阅读

[C++知识库]【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++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-11-19 17:27:06  更:2021-11-19 17:28:29 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 7:26:14-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码