C 语言数组 ( 指针退化验证 | 计算数组大小 | #define LENGTH(array) (sizeof(array) / sizeof(*array)) )

Posted 韩曙亮

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C 语言数组 ( 指针退化验证 | 计算数组大小 | #define LENGTH(array) (sizeof(array) / sizeof(*array)) )相关的知识,希望对你有一定的参考价值。





一、指针退化验证



n n n 维数组 作为 函数参数 , 会退化为 指针 , 注意这里只有 最高维 n n n退化为指针 , 该指针指向 若干 n − 1 n-1 n1 维数组 ;

验证 指针退化 问题 , 只需要使用

sizeof(array) / sizeof(*array)

代码 , 求数组大小即可 ;


假如 array 是数组 , 则 sizeof(array) 是整个数组的大小 , *array 是数组首元素 , sizeof(*array) 是数组首元素大小 , sizeof(array) / sizeof(*array) 就是数组大小 ;

array 表示数组首元素地址 , &array 表示数组地址 ;


假如 array 是指针 , 则 sizeof(array) 是指针变量的大小 4 4 4 字节 , *array 是指针指向的元素 , sizeof(*array) 是指针指向的元素的大小 , sizeof(array) / sizeof(*array) 就是 4 数 据 类 型 大 小 \\cfrac4数据类型大小 4 , 该值明显与数组大小不同 ;

通过上述公式 , 即可验证一个 变量 是 数组 还是 指针 ;


计算数组大小宏定义 :

/* 计算数组 array 大小 */
#define LENGTH(array) (sizeof(array)/sizeof(*array))




二、完整代码示例



完整代码示例 :

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/* 计算数组 array 大小 */
#define LENGTH(array) (sizeof(array)/sizeof(*array))

/**
 * @brief fun 二维数组 作函数参数 , 退化为 数组指针
 *            每个指针 指向一个 一维数组
 */
void fun(int (*array)[3])

    // 使用如下方法验证 array 形参是否是数组
    int len = LENGTH(array);
    printf("fun array len : %d\\n", len);


/**
 * @brief 主函数入口
 * @return
 */
int main()

    // 定义数组
    int array[2][3] = 0;

    // 计算数组长度
    int len = LENGTH(array);
    // 打印数组长度
    printf("main array len : %d\\n", len);

    // 二维数组作为函数参数
    fun(array);


    // 命令行不要退出
    system("pause");
    return 0;

执行结果 :

main array len : 2
fun array len : 0
请按任意键继续. . .

以上是关于C 语言数组 ( 指针退化验证 | 计算数组大小 | #define LENGTH(array) (sizeof(array) / sizeof(*array)) )的主要内容,如果未能解决你的问题,请参考以下文章

C 语言数组作为参数退化为指针问题 ( 问题描述 | 从编译器角度分析该问题 | 出于提高 C 语言执行效率角度考虑 | 数组作为参数的推荐方案 )

C 语言二级指针作为输入 ( 指针数组 | 将 二级指针 作为函数输入 | 抽象函数业务逻辑 )

C 语言数组 ( 一维数组形参退化 | 二维数组形参退化 | 函数形参等价关系 )

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

C 语言二级指针作为输入 ( 二维数组 | 二维数组内存大小计算 | 指针跳转步长问题 )

C语言数组如何进行元素求和?