【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

目录
相关文章
|
9月前
|
存储 人工智能 程序员
一文彻底搞明白C语言的数组
本文详细介绍了C语言中的数组,包括定义、初始化(静态与动态)、存储方式、访问方法及常用操作,如遍历、修改元素和作为函数参数传递。数组是C语言中最基本的数据结构之一,掌握它对编程至关重要。下篇将介绍二维数组,敬请期待!
393 0
一文彻底搞明白C语言的数组
|
9月前
|
存储 人工智能 Java
一文轻松拿捏C语言的指针的基础使用
本文介绍了C语言中的指针概念,包括直接访问和间接访问内存的方式、指针变量的定义与使用、取址运算符`&`和取值运算符`*`的应用,帮助读者深入理解指针这一C语言的核心概念。君志所向,一往无前!
154 0
|
11月前
|
存储 NoSQL 编译器
【C语言】指针的神秘探险:从入门到精通的奇幻之旅 !
指针是一个变量,它存储另一个变量的内存地址。换句话说,指针“指向”存储在内存中的某个数据。
331 7
【C语言】指针的神秘探险:从入门到精通的奇幻之旅 !
|
11月前
|
存储 编译器 C语言
【C语言】指针大小知多少 ?一场探寻C语言深处的冒险 !
在C语言中,指针的大小(即指针变量占用的内存大小)是由计算机的体系结构(例如32位还是64位)和编译器决定的。
1220 9
|
11月前
|
安全 程序员 C语言
【C语言】指针的爱恨纠葛:常量指针vs指向常量的指针
在C语言中,“常量指针”和“指向常量的指针”是两个重要的指针概念。它们在控制指针的行为和数据的可修改性方面发挥着关键作用。理解这两个概念有助于编写更安全、有效的代码。本文将深入探讨这两个概念,包括定义、语法、实际应用、复杂示例、最佳实践以及常见问题。
315 7
|
11月前
|
存储 算法 安全
C 语言中的位运算:挖掘底层计算的高效力量
位运算是C语言中直接操作二进制位的一种技术,能高效处理底层数据,广泛应用于优化算法、硬件编程等领域,是掌握C语言高级特性的关键之一。
|
11月前
|
传感器 算法 安全
【C语言】两个数组比较详解
比较两个数组在C语言中有多种实现方法,选择合适的方法取决于具体的应用场景和性能要求。从逐元素比较到使用`memcmp`函数,再到指针优化,每种方法都有其优点和适用范围。在嵌入式系统中,考虑性能和资源限制尤为重要。通过合理选择和优化,可以有效提高程序的运行效率和可靠性。
777 6
|
4月前
|
测试技术 PHP 开发者
PHP 数组查找:为什么 `isset()` 比 `in_array()` 快得多?
PHP 数组查找:为什么 `isset()` 比 `in_array()` 快得多?
|
8月前
|
人工智能 Java
Java 中数组Array和列表List的转换
本文介绍了数组与列表之间的相互转换方法,主要包括三部分:1)使用`Collections.addAll()`方法将数组转为列表,适用于引用类型,效率较高;2)通过`new ArrayList&lt;&gt;()`构造器结合`Arrays.asList()`实现类似功能;3)利用JDK8的`Stream`流式计算,支持基本数据类型数组的转换。此外,还详细讲解了列表转数组的方法,如借助`Stream`实现不同类型数组间的转换,并附带代码示例与执行结果,帮助读者深入理解两种数据结构的互转技巧。
463 1
Java 中数组Array和列表List的转换
|
8月前
|
JavaScript 前端开发 API
JavaScript中通过array.map()实现数据转换、创建派生数组、异步数据流处理、复杂API请求、DOM操作、搜索和过滤等,array.map()的使用详解(附实际应用代码)
array.map()可以用来数据转换、创建派生数组、应用函数、链式调用、异步数据流处理、复杂API请求梳理、提供DOM操作、用来搜索和过滤等,比for好用太多了,主要是写法简单,并且非常直观,并且能提升代码的可读性,也就提升了Long Term代码的可维护性。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
下一篇
开通oss服务