【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;
}`

执行结果 :​

10150846_61dbdb7edf1a229811.webp

二、从编译器角度分析该问题

二、从编译器角度分析该问题 该问题的理解 , 需要从 C/C++ 编译器的角度进行理解 , 代码开发出来 , 主要是给编译器使用的 , 让编译器明白开发者的意图 ;

上述示例中 , 函数的 实参是

// 将要作为实参的数组 int array[3] = {1, 2, 3}; 1. 2. , 其类型是 int 数组 ; 函数的 形参是 void fun(int array[3]) 中的

int array[3] 1. 其类型是指针 ;

上述 实参的 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;
}`

111.webp

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/36793.html

(0)
上一篇 2023-11-12
下一篇 2023-11-13

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注