详解sizeof、strlen、指针和数组等组合题

简介: 详解sizeof、strlen、指针和数组等组合题

  本部分属于C语言高级玩法  


🚀目录

本部分属于指针、数组、sizeof和strlen组合在一起的高级玩法,助你轻松拿下!

1.坑点总结

2.题目解析


🔥🔥🔥坑点总结

1. sizeof  

①sizeof(数组名);这里的数组名表示整个数组,而不是整个数组的地址

②sizeof 是操作符,计算变量的类型所占内存空间的大小,单位是字节,不关注内存中存放的内容

③sizeof是根据类型分析,不会访问具体内容

printf("%d\n",sizeof(指针)),得到的大小是4个字节(在x86环境下)或8个字节(在x64环境下)

2. strlen  

①strlen 是库函数,使用时需要引头文件<string.h>,专门求字符串长度,只能针对字符串,向后一直找\0,统计\0之前的字符个数

②strlen()只可以接收地址,strlen('a')或strlen(97),属于非法访问,是个野指针!


🔥🔥🔥题目解析

以下题目包含了对数组名的理解、指针的运算和指针类型的意义等非常重要的知识点,


🔺//一维数组

🔸 重点总结:

①sizeof()只关注括号中的类型,不关注其内容

②sizeof(指针)则答案为4个字节或者8个字节

int a[ ] = {1,2,3,4};


printf("%d\n",sizeof(a));得16

printf("%d\n",sizeof(a+0));得4或8

printf("%d\n",sizeof(*a));得4

printf("%d\n",sizeof(a+1));得4或8

printf("%d\n",sizeof(a[1]));得4

printf("%d\n",sizeof(&a));得4或8

printf("%d\n",sizeof(*&a));得16

printf("%d\n",sizeof(&a+1));得4或8

printf("%d\n",sizeof(&a[0]));得4或8

printf("%d\n",sizeof(&a[0]+1));得4或8


🔺//字符数组

🔸 重点总结:

①strlen()的括号中只能存放地址,并沿着这个地址一直向后寻找 \0

②字符指针存放的是第一个字符的地址,和这个指针的地址不是同一个地址

char arr[ ] = {'a','b','c','d','e','f'};


printf("%d\n", sizeof(arr));得6

printf("%d\n", sizeof(arr+0));得4或8

printf("%d\n", sizeof(*arr));得1

printf("%d\n", sizeof(arr[1]));得1

printf("%d\n", sizeof(&arr));得4或8

printf("%d\n", sizeof(&arr+1));得4或8

printf("%d\n", sizeof(&arr[0]+1));得4或8

printf("%d\n", strlen(arr));得随机值

printf("%d\n", strlen(arr+0));得随机值

printf("%d\n", strlen(*arr));得error

printf("%d\n", strlen(arr[1]));得error

printf("%d\n", strlen(&arr));得随机值

printf("%d\n", strlen(&arr+1));得随机值-6

printf("%d\n", strlen(&arr[0]+1));得随机值-1

char arr[ ] = "abcdef";


printf("%d\n", sizeof(arr));得7

printf("%d\n", sizeof(arr+0));得4或8

printf("%d\n", sizeof(*arr));得1

printf("%d\n", sizeof(arr[1]));得1

printf("%d\n", sizeof(&arr));得4或8

printf("%d\n", sizeof(&arr+1));得4或8

printf("%d\n", sizeof(&arr[0]+1));得4或8

printf("%d\n", strlen(arr));得6

printf("%d\n", strlen(arr+0));得6

printf("%d\n", strlen(*arr));得error

printf("%d\n", strlen(arr[1]));得error

printf("%d\n", strlen(&arr));得6

printf("%d\n", strlen(&arr+1));得随机值

printf("%d\n", strlen(&arr[0]+1));得5

char *p = "abcdef";


printf("%d\n", sizeof(p));得4或8

printf("%d\n", sizeof(p+1));得4或8

printf("%d\n", sizeof(*p));得1

printf("%d\n", sizeof(p[0]));得1

printf("%d\n", sizeof(&p));得4或8

printf("%d\n", sizeof(&p+1));得4或8

printf("%d\n", sizeof(&p[0]+1));得4或8

printf("%d\n", strlen(p));得6

printf("%d\n", strlen(p+1));得5

printf("%d\n", strlen(*p));得error

printf("%d\n", strlen(p[0]));得error

printf("%d\n", strlen(&p));得随机值

printf("%d\n", strlen(&p+1));得随机值

printf("%d\n", strlen(&p[0]+1));得5


🔺//二维数组

🔸重点总结:

①一个二维数组arr[3][4],arr[0]表示第一行的地址,arr[1]表示第二行的地址,arr[2]表示第三行的地址

②sizeof('a'+1),会发生整型提升

int a[3][4] = {0};


printf("%d\n",sizeof(a));得48

printf("%d\n",sizeof(a[0][0]));得4

printf("%d\n",sizeof(a[0]));得16

printf("%d\n",sizeof(a[0]+1));得4或8

特别注意:本题中a[0]表示第一行第一个元素的地址,+1则为第一行第二个元素的地址

printf("%d\n",sizeof(*(a[0]+1)));得4

printf("%d\n",sizeof(a+1));得4或8

特别注意:本题中a表示该二维数组第一行的地址,+1则为该二维数组第二行的地址

printf("%d\n",sizeof(*(a+1)));得16

printf("%d\n",sizeof(&a[0]+1));得4或8

特别注意:本题中&a[0]表示该二维数组第一行的地址,+1为该二维数组第二行的地址

printf("%d\n",sizeof(*(&a[0]+1)));得16

printf("%d\n",sizeof(*a));得16

特别注意:本题中a表示第一行元素的地址,解引用后为二维数组的第一行

printf("%d\n",sizeof(a[3]));得16

特别注意:尽管a[3]属于越界访问,但是sizeof计算变量的类型所占内存空间的大小,sizeof根据类型分析,并不会访问第四行的内容


🚀结语

如果对您有帮助的话,

不要忘记点赞+关注哦,蟹蟹

如果对您有帮助的话,

不要忘记点赞+关注哦,蟹蟹

如果对您有帮助的话,

不要忘记点赞+关注哦,蟹蟹

相关文章
|
2月前
使用指针访问数组元素
【10月更文挑战第30天】使用指针访问数组元素。
46 3
|
2月前
|
存储 程序员 编译器
C 语言数组与指针的深度剖析与应用
在C语言中,数组与指针是核心概念,二者既独立又紧密相连。数组是在连续内存中存储相同类型数据的结构,而指针则存储内存地址,二者结合可在数据处理、函数传参等方面发挥巨大作用。掌握它们的特性和关系,对于优化程序性能、灵活处理数据结构至关重要。
|
2月前
|
存储 C语言 计算机视觉
在C语言中指针数组和数组指针在动态内存分配中的应用
在C语言中,指针数组和数组指针均可用于动态内存分配。指针数组是数组的每个元素都是指针,可用于指向多个动态分配的内存块;数组指针则指向一个数组,可动态分配和管理大型数据结构。两者结合使用,灵活高效地管理内存。
|
2月前
|
容器
在使用指针数组进行动态内存分配时,如何避免内存泄漏
在使用指针数组进行动态内存分配时,避免内存泄漏的关键在于确保每个分配的内存块都能被正确释放。具体做法包括:1. 分配后立即检查是否成功;2. 使用完成后及时释放内存;3. 避免重复释放同一内存地址;4. 尽量使用智能指针或容器类管理内存。
|
2月前
|
存储 NoSQL 编译器
C 语言中指针数组与数组指针的辨析与应用
在C语言中,指针数组和数组指针是两个容易混淆但用途不同的概念。指针数组是一个数组,其元素是指针类型;而数组指针是指向数组的指针。两者在声明、使用及内存布局上各有特点,正确理解它们有助于更高效地编程。
|
2月前
|
存储 人工智能 算法
数据结构实验之C 语言的函数数组指针结构体知识
本实验旨在复习C语言中的函数、数组、指针、结构体与共用体等核心概念,并通过具体编程任务加深理解。任务包括输出100以内所有素数、逆序排列一维数组、查找二维数组中的鞍点、利用指针输出二维数组元素,以及使用结构体和共用体处理教师与学生信息。每个任务不仅强化了基本语法的应用,还涉及到了算法逻辑的设计与优化。实验结果显示,学生能够有效掌握并运用这些知识完成指定任务。
70 4
|
2月前
使用指针访问数组元素
【10月更文挑战第31天】使用指针访问数组元素。
54 2
|
2月前
|
算法 索引
单链表题+数组题(快慢指针和左右指针)
单链表题+数组题(快慢指针和左右指针)
43 1
|
3月前
|
存储
如何使用指针数组来实现动态二维数组
指针数组可以用来实现动态二维数组。首先,定义一个指向指针的指针变量,并使用 `malloc` 为它分配内存,然后为每个子数组分配内存。通过这种方式,可以灵活地创建和管理不同大小的二维数组。
|
3月前
|
存储
如何通过指针数组来实现二维数组?
介绍了二维数组和指针数组的概念及其区别,详细讲解了如何使用指针数组模拟二维数组,包括定义与分配内存、访问和赋值元素、以及正确释放内存的步骤,适用于需要动态处理二维数据的场景。