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

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

文章目录

一、指针退化验证

二、完整代码示例





一、指针退化验证


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


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


sizeof(array) / sizeof(*array)


代码 , 求数组大小即可 ;



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


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



假如 array 是指针 , 则 sizeof(array) 是指针变量的大小 4 44 字节 , *array 是指针指向的元素 , sizeof(*array) 是指针指向的元素的大小 , sizeof(array) / sizeof(*array) 就是

4 数 据 类 型 大 小 \cfrac{4}{数据类型大小}

数据类型大小

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
请按任意键继续. . .

image.png

目录
相关文章
|
2月前
|
C语言
【c语言】指针就该这么学(1)
本文详细介绍了C语言中的指针概念及其基本操作。首先通过生活中的例子解释了指针的概念,即内存地址。接着,文章逐步讲解了指针变量的定义、取地址操作符`&`、解引用操作符`*`、指针变量的大小以及不同类型的指针变量的意义。此外,还介绍了`const`修饰符在指针中的应用,指针的运算(包括指针加减整数、指针相减和指针的大小比较),以及野指针的概念和如何规避野指针。最后,通过具体的代码示例帮助读者更好地理解和掌握指针的使用方法。
50 0
|
2天前
|
程序员 编译器 C语言
C语言中的预处理器指令,涵盖其基本概念、常见指令(如`#define`、`#include`、条件编译指令等)、使用技巧及注意事项
本文深入解析C语言中的预处理器指令,涵盖其基本概念、常见指令(如`#define`、`#include`、条件编译指令等)、使用技巧及注意事项,并通过实际案例分析,展示预处理器指令在代码编写与处理中的重要性和灵活性。
15 2
|
3天前
|
存储 程序员 编译器
C 语言数组与指针的深度剖析与应用
在C语言中,数组与指针是核心概念,二者既独立又紧密相连。数组是在连续内存中存储相同类型数据的结构,而指针则存储内存地址,二者结合可在数据处理、函数传参等方面发挥巨大作用。掌握它们的特性和关系,对于优化程序性能、灵活处理数据结构至关重要。
|
2月前
|
C语言
【c语言】指针就该这么学(3)
本文介绍了C语言中的函数指针、typedef关键字及函数指针数组的概念与应用。首先讲解了函数指针的创建与使用,接着通过typedef简化复杂类型定义,最后探讨了函数指针数组及其在转移表中的应用,通过实例展示了如何利用这些特性实现更简洁高效的代码。
18 2
|
2月前
|
C语言
如何避免 C 语言中的野指针问题?
在C语言中,野指针是指向未知内存地址的指针,可能引发程序崩溃或数据损坏。避免野指针的方法包括:初始化指针为NULL、使用完毕后将指针置为NULL、检查指针是否为空以及合理管理动态分配的内存。
|
2月前
|
C语言
C语言:哪些情况下会出现野指针
C语言中,野指针是指指向未知地址的指针,通常由以下情况产生:1) 指针被声明但未初始化;2) 指针指向的内存已被释放或重新分配;3) 指针指向局部变量,而该变量已超出作用域。使用野指针可能导致程序崩溃或不可预测的行为。
|
2月前
|
人工智能 前端开发 JavaScript
拿下奇怪的前端报错(一):报错信息是一个看不懂的数字数组Buffer(475) [Uint8Array],让AI大模型帮忙解析
本文介绍了前端开发中遇到的奇怪报错问题,特别是当错误信息不明确时的处理方法。作者分享了自己通过还原代码、试错等方式解决问题的经验,并以一个Vue3+TypeScript项目的构建失败为例,详细解析了如何从错误信息中定位问题,最终通过解读错误信息中的ASCII码找到了具体的错误文件。文章强调了基础知识的重要性,并鼓励读者遇到类似问题时不要慌张,耐心分析。
|
2月前
|
编译器 C语言
【c语言】指针就该这么学(2)
本文详细介绍了指针与数组的关系,包括指针访问数组、一维数组传参、二级指针、指针数组和数组指针等内容。通过具体代码示例,解释了数组名作为首元素地址的用法,以及如何使用指针数组模拟二维数组和传递二维数组。文章还强调了数组指针与指针数组的区别,并通过调试窗口展示了不同类型指针的差异。最后,总结了指针在数组操作中的重要性和应用场景。
19 0
|
2月前
|
C语言
无头链表二级指针方式实现(C语言描述)
本文介绍了如何在C语言中使用二级指针实现无头链表,并提供了创建节点、插入、删除、查找、销毁链表等操作的函数实现,以及一个示例程序来演示这些操作。
28 0
|
3月前
|
存储 人工智能 C语言
C语言程序设计核心详解 第八章 指针超详细讲解_指针变量_二维数组指针_指向字符串指针
本文详细讲解了C语言中的指针,包括指针变量的定义与引用、指向数组及字符串的指针变量等。首先介绍了指针变量的基本概念和定义格式,随后通过多个示例展示了如何使用指针变量来操作普通变量、数组和字符串。文章还深入探讨了指向函数的指针变量以及指针数组的概念,并解释了空指针的意义和使用场景。通过丰富的代码示例和图形化展示,帮助读者更好地理解和掌握C语言中的指针知识。