当前位置: 首页 > article >正文

高阶C语言|数组名的深度解析(数组名结合sizeof与strlen的详解)

💬 欢迎讨论:在阅读过程中有任何疑问,欢迎在评论区留言,我们一起交流学习!
👍 点赞、收藏与分享:如果你觉得这篇文章对你有帮助,记得点赞、收藏,并分享给更多对C语言感兴趣的朋友!

文章目录

      • 前言
      • 正文开始~
        • 1. `sizeof(数组名)`:计算整个数组的大小
        • 2. `&数组名`:取整个数组的地址
        • 3. 数组名作为首元素地址的指针
        • 4. 一维数组的深度解析
        • 5. 字符数组的解析
        • 6. 字符串数组的特别处理
        • 7. 指针变量与字符串的关系
        • 8. 二维数组的深度解析
      • 总结

前言

在C语言中,数组和指针是两大基础知识点,理解它们的内在联系对于编写高效的代码至关重要。尤其是在面试过程中,数组和指针相关的题目经常出现在笔试和面试中。本文将通过详细的例子和解析,帮助你更好地理解数组名的各种含义。

正文开始~

1. sizeof(数组名):计算整个数组的大小

sizeof操作符用于获取一个对象的内存大小。在C语言中,数组名在不同的上下文中有不同的含义。使用sizeof操作符时,数组名表示整个数组,而不是数组的首元素。

例子:

int a[] = {1, 2, 3, 4};
printf("%d\n", sizeof(a));  // 输出16,整个数组的大小

对于一维数组,sizeof(a)将返回整个数组所占的内存大小。比如,对于一个包含4个整数元素的数组,每个int类型占4个字节,因此总大小为16字节。

2. &数组名:取整个数组的地址

当我们使用&操作符时,它表示获取数组本身的地址,而不是数组首元素的地址。数组名本身在大多数情况下表示的是数组首元素的地址,但是通过&操作符,可以明确获得整个数组的地址。

例子:

int a[] = {1, 2, 3, 4};
printf("%d\n", sizeof(&a));  // 输出4或8,取决于平台

这里的&a表示整个数组的地址,而sizeof(&a)的结果则是获取这个地址所占的字节数。在大多数平台上,地址大小通常为4字节(32位系统)或8字节(64位系统)。

3. 数组名作为首元素地址的指针

除了sizeof&操作符,数组名在其他情况下表示的是数组的首元素的地址。在数组的许多运算中,数组名就像一个指针,指向数组的第一个元素。理解这一点对于理解数组和指针之间的关系至关重要。

例子:

int a[] = {1, 2, 3, 4};
printf("%d\n", sizeof(a+0));  // 输出4/8,a+0是数组的首元素地址
printf("%d\n", sizeof(*a));    // 输出4,*a解引用后得到的是第一个元素

在上面的例子中,a+0代表数组的首元素地址,*a则解引用该地址,得到数组的第一个元素。

4. 一维数组的深度解析

数组的各种操作:

int a[] = {1, 2, 3, 4};
printf("%d\n", sizeof(a));     // 输出16,计算整个数组的大小
printf("%d\n", sizeof(a+0));   // 输出4/8,a+0代表的是数组首元素的地址
printf("%d\n", sizeof(*a));    // 输出4,解引用得到第一个元素
printf("%d\n", sizeof(a[1]));  // 输出4,a[1]是数组的第二个元素
printf("%d\n", sizeof(&a));    // 输出4/8,表示整个数组的地址
  1. sizeof(a):返回整个数组的大小。对于一个包含4个int元素的数组,sizeof(a)返回的值为16字节(假设每个int占4字节)。

  2. sizeof(a+0):这里,a+0表示数组的首元素地址,所以sizeof(a+0)实际上是返回数组元素指针所占的大小。

  3. sizeof(*a)*a表示解引用数组首元素的指针,返回的是数组第一个元素的大小。

  4. sizeof(a[1]):返回的是a[1]的大小,因为a[1]是一个单独的int类型变量。

5. 字符数组的解析

字符数组常常被用于存储字符串。对于字符数组,sizeofstrlen有不同的行为。sizeof计算的是数组的总大小,包括数组中的所有元素,而strlen只计算字符串的长度,不包括结尾的空字符('\0')。

char arr[] = {'a', 'b', 'c', 'd', 'e', 'f'};
printf("%d\n", sizeof(arr));      // 输出6,计算整个字符数组的大小
printf("%d\n", sizeof(arr+0));    // 输出4/8,arr+0为首元素地址
printf("%d\n", sizeof(*arr));     // 输出1,字符'a'的大小
printf("%d\n", sizeof(arr[1]));   // 输出1,字符'b'的大小
6. 字符串数组的特别处理

当字符数组初始化为字符串时,sizeofstrlen的行为会有所不同。sizeof会计算整个数组的大小,包括结尾的空字符(\0),而strlen只计算字符串的实际长度(不包括\0)。

char arr[] = "abcdef";
printf("%d\n", sizeof(arr));     // 输出6,包含结尾的'\0'
printf("%d\n", strlen(arr));     // 输出6,不包含'\0'
7. 指针变量与字符串的关系

指针是C语言中非常重要的概念,尤其是在处理字符串时,指针和数组的关系尤为密切。以下示例展示了如何使用指针处理字符串以及sizeofstrlen在指针操作中的表现。

char *p = "abcdef";
printf("%d\n", sizeof(p));    // 输出4/8,指针变量占用的内存大小
printf("%d\n", strlen(p));    // 输出6,字符串的长度

sizeof(p)返回的是指针本身所占的内存大小,而strlen(p)则计算字符串的长度。

8. 二维数组的深度解析

二维数组的地址和一维数组的处理方式有所不同。二维数组实际上是由多个一维数组组成的,所以数组名是指向二维数组第一行的指针。我们可以通过sizeof来理解二维数组的内存布局。

int a[3][4] = {0};
printf("%d\n", sizeof(a));     // 输出48,3行4列的数组总大小
printf("%d\n", sizeof(a[0]));  // 输出16,第一行的大小
printf("%d\n", sizeof(a+1));   // 输出4/8,第二行的地址

在二维数组中,a代表的是二维数组的首地址,即第一行的地址,而a+1代表的是第二行的地址。

总结

通过以上内容的分析,我们可以总结出一些关键点:

  • sizeof(数组名):计算整个数组的大小。
  • &数组名:表示整个数组的地址。
  • 数组名:在大多数情况下,表示数组首元素的地址,类似指针。
  • strlen:用于计算字符串的长度,但仅适用于字符数组或指向字符串的指针。

http://www.kler.cn/a/518932.html

相关文章:

  • Docker快速部署高效照片管理系统LibrePhotos搭建私有云相册
  • kafka-保姆级配置说明(consumer)
  • 【图文详解】lnmp架构搭建Discuz论坛
  • Pyecharts图表交互功能提升
  • Linux查看服务器的内外网地址
  • Linux-day10
  • impact 影响分析学习笔记(一)
  • 【后端面试总结】mysql的join,left join,right join,full join分别是什么意思
  • maven 全局配置
  • 【Python使用】嘿马python高级进阶全体系教程第11篇:静态Web服务器-面向对象开发,1. 以面向对象的方式开发静态W
  • 79,【3】BUUCTF WEB [GXYCTF2019]BabysqliV3.0
  • mongoDB常见指令
  • Go中new和make的区别对比
  • 机器学习的通俗解释
  • Node.js下载安装及环境配置教程 (详细版)
  • 服务器中的流量主要是指什么?
  • RPC是什么?和HTTP区别?
  • Python 对列表进行排序的 5 种方法
  • C++17 新增属性详解
  • Unity在WebGL中拍照和录视频
  • 通过Python编程语言实现“机器学习”小项目教程案例
  • 【Rust自学】15.2. Deref trait Pt.1:什么是Deref、解引用运算符*与实现Deref trait
  • Mongodb副本集群为什么选择3个节点不选择4个节点
  • 【Matlab高端绘图SCI绘图模板】第002期 绘制面积图
  • Spring中的事务管理器TransactionManager
  • 【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】1.2 ndarray解剖课:多维数组的底层实现