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

💬 欢迎讨论:在阅读过程中有任何疑问,欢迎在评论区留言,我们一起交流学习!

👍 点赞、收藏与分享:如果你觉得这篇文章对你有帮助,记得点赞、收藏,并分享给更多对C语言感兴趣的朋友!

文章目录

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

前言

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

正文开始~

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

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

例子:

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

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

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

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

例子:

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

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

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

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

例子:

c 复制代码
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. 一维数组的深度解析

数组的各种操作:

c 复制代码
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')。

c 复制代码
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)。

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

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

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

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

8. 二维数组的深度解析

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

c 复制代码
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:用于计算字符串的长度,但仅适用于字符数组或指向字符串的指针。
相关推荐
Eiceblue1 小时前
Python 合并 Excel 单元格
开发语言·vscode·python·pycharm·excel
SomeB1oody2 小时前
【Rust自学】15.2. Deref trait Pt.1:什么是Deref、解引用运算符*与实现Deref trait
开发语言·后端·rust
情深不寿3173 小时前
C++----STL(list)
开发语言·c++
SomeB1oody3 小时前
【Rust自学】15.4. Drop trait:告别手动清理,释放即安全
开发语言·后端·rust
liruiqiang053 小时前
DDD-全面理解领域驱动设计中的各种“域”
开发语言·架构
前端熊猫3 小时前
JavaScript 的 Promise 对象和 Promise.all 方法的使用
开发语言·前端·javascript
weixin_421133414 小时前
编写python 后端 vscode 安装插件大全
开发语言·vscode·python
_GR4 小时前
Java程序基础⑪Java的异常体系和使用
java·开发语言
lzhdim4 小时前
3、C#基于.net framework的应用开发实战编程 - 实现(三、二) - 编程手把手系列文章...
开发语言·c#·.net
菜菜小蒙4 小时前
【C++】特殊类设计、单例模式与类型转换
开发语言·c++