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



执行结果 :


image.png






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


该问题的理解 , 需要从 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;
}



执行结果 :


image.png

目录
相关文章
|
23天前
|
存储 C语言 C++
如何通过指针作为函数参数来实现函数的返回多个值
在C语言中,可以通过将指针作为函数参数来实现函数返回多个值。调用函数时,传递变量的地址,函数内部通过修改指针所指向的内存来改变原变量的值,从而实现多值返回。
|
26天前
|
存储 编译器 C语言
【c语言】数组
本文介绍了数组的基本概念及一维和二维数组的创建、初始化、使用方法及其在内存中的存储形式。一维数组通过下标访问元素,支持初始化和动态输入输出。二维数组则通过行和列的下标访问元素,同样支持初始化和动态输入输出。此外,还简要介绍了C99标准中的变长数组,允许在运行时根据变量创建数组,但不能初始化。
35 6
|
23天前
|
存储 搜索推荐 C语言
如何理解指针作为函数参数的输入和输出特性
指针作为函数参数时,可以实现输入和输出的双重功能。通过指针传递变量的地址,函数可以修改外部变量的值,实现输出;同时,指针本身也可以作为输入,传递初始值或状态。这种方式提高了函数的灵活性和效率。
|
29天前
|
存储 算法 C语言
C语言:什么是指针数组,它有什么用
指针数组是C语言中一种特殊的数据结构,每个元素都是一个指针。它用于存储多个内存地址,方便对多个变量或数组进行操作,常用于字符串处理、动态内存分配等场景。
|
1月前
|
存储 C语言
C语言:一维数组的不初始化、部分初始化、完全初始化的不同点
C语言中一维数组的初始化有三种情况:不初始化时,数组元素的值是随机的;部分初始化时,未指定的元素会被自动赋值为0;完全初始化时,所有元素都被赋予了初始值。
|
1月前
|
C语言
C语言数组
C语言数组
17 0
|
6月前
|
C语言
C语言---指针进阶
C语言---指针进阶
46 0
|
11月前
|
C语言
C语言指针进阶(下)
C语言指针进阶(下)
58 1
|
11月前
|
编译器 C语言
C语言指针进阶(上)
C语言指针进阶(上)
102 1
|
11月前
|
C语言
C语言指针进阶(中)
C语言指针进阶(中)
50 0