指针(7)

目录

[1. sizeof和strlen的对⽐](#1. sizeof和strlen的对⽐)

[1.1 sizeof](#1.1 sizeof)

[1.2 strlen](#1.2 strlen)

[sizeof 和 strlen 总结:](#sizeof 和 strlen 总结:)

[2. 数组和指针](#2. 数组和指针)

[2.1 ⼀维数组](#2.1 ⼀维数组)

[2.2 字符数组](#2.2 字符数组)


1. sizeof和strlen的对⽐

1.1 sizeof

计算的是使⽤类型创建的变量所占内存空间的⼤⼩。sizeof不在乎你里面放的什么。sizieof是****操作符不是库函数

复制代码
#include <stdio.h>
int main()
{
	int  a = 10;
	printf("%zd ", sizeof(a));
	printf("%zd ", sizeof( int) );
	int arr[10] = { 0 };
	printf("%zd ", sizeof(arr));

	return 0;
}

这个代码想必大家很熟悉了吧,前面讲到sizeof的时候有讲。如果的话可以回去看这个一篇继续更新 c语言 3-CSDN博客里面有讲到sizeof

1.2 strlen

strlen 是c语言中的库函数,不是操作符,不要把这个和sizeof混淆了。strlen针对的是字符串长度和字符数组,遇到 \0就会停止,统计 \0 之前的字符。

大家可以思考一下这个代码的运行结果是什么?

复制代码
#include<stdio.h>
#include<string.h> 
int main()
{
	char  arr1[5] = "asdf";
	char  arr2[5] = { 'a','s','d','f' };
	printf("%zd ", sizeof(arr1));//5
	printf("%zd ", strlen(arr1));//4
	printf("%zd ", sizeof(arr2));//5
	printf("%zd ", strlen (arr2));//4
	return 0;
}

公布结果!

和我们后面注释的结果一直致,由上面运行结果就可以得出:

sizeof 和 strlen 总结:

sizeof

1. sizeof是操作符

2. sizeof计算操作数所占内存的 ⼤⼩,单位是字节

3. 不关注内存中存放什么数据

strlen

1. strlen是库函数,使⽤需要包含头⽂件 string.h

2. srtlen是求字符串⻓度的,统计的是 \0 之前字符的个数

3. 关注内存中是否有 \0 ,如果没有 \0 ,就会持续往后找,可能 会越界

2. 数组和指针

2.1 ⼀维数组

下面有些习题大家可以做一做,可以更深层的了解sizeof和strlen

复制代码
#include <stdio.h>
int a[] = {1,2,3,4};
{
printf("%zd\n",sizeof(a));
printf("%zd\n",sizeof(a+0));
printf("%zd\n",sizeof(*a));
printf("%zd\n",sizeof(a+1));
printf("%zd\n",sizeof(a[1]));
printf("%zd\n",sizeof(&a));
printf("%zd\n",sizeof(*&a));
printf("%zd\n",sizeof(&a+1));
}

如果这里你大概掌握了strlen和sizeof的基本操作原理 那么上面的代码对你来说不是很难

结果如下:

这里不懂4**/8是什么意思的,可以参考我这篇笔记**

复制代码
#incldue <stdio.h>
int main()
{
	int a[] = { 1,2,3,4 };
	printf("%zd\n", sizeof(a));//这里的a是代表数组名的长度 16
	printf("%zd\n", sizeof(a + 0));//a 是数组名也就是首元素的地址这个a+0就是首元素的地址。4/ 8
	printf("%zd\n", sizeof(*a));//* a是首元素 取的也是内容所以就是4 字节
	printf("%zd\n", sizeof(a + 1));//a 是首元素地址,a+1是第二个元素地址 是地址就是 4/8
	printf("%zd\n", sizeof(a[1]));// a[1]是下标为1的元素 4
	printf("%zd\n", sizeof(&a));//这里的&a是整个数组的地址,然而是地址就是8个字节,地址不分贵贱
	printf("%zd\n", sizeof(*&a));//这里的 (*&a )是可以相互抵消的,sizeof(a)就是数组名的长度  16
	printf("%zd\n", sizeof(&a + 1)); //这个&a 是整个数组的地址,a+1就会跳过这个数组,然而是地址就是4/8
	printf("%d\n", sizeof(&a[0]));//这里的首元素的地址 是地址就是4/8
	printf("%d\n", sizeof(&a[0] + 1));//这个就是上面的基础上+1 就是第二个元素的地址,是地址就是 4/8
	return 0;
}

大家可以自行复制代码研究一下

2.2 字符数组

话不多说直接上代码,大家可以算一算

复制代码
#include <stdio.h>
int main()
{
char arr[] = {'a','b','c','d','e','f'};
printf("%d\n", sizeof(arr));
printf("%d\n", sizeof(arr+0));
printf("%d\n", sizeof(*arr));
printf("%d\n", sizeof(arr[1]));
printf("%d\n", sizeof(&arr));
printf("%d\n", sizeof(&arr+1));
printf("%d\n", sizeof(&arr[0]+1));

}

结果如下:

如果全做错,也不要气馁 ,没有人生来就是天才一学就会,我这次做也就对了几个。只要你肯努力总有一天,你会成为凤凰的。 我大学学的是机械与这个无关 ,但是我依然坚持学习。每天进步一点点就是我的座右铭了。

复制代码
#include <stdio.h>
int main()
{
	char arr[] = { 'a','b','c','d','e','f' };
	printf("%d\n", sizeof(arr));//这里字符是6个 注意这里是大括号不存在 \0
	printf("%d\n", sizeof(arr + 0));//这里是首元素的地址 4 /8
	printf("%d\n", sizeof(*arr));// 1 arr是首元素
	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));//首元素地址加1,就是第二个元素地址 4/8

	return 0;
}

下面继续看一看下面代码

首先strlen的特点是遇到\0 停止

复制代码
#include <stdio.h>
inmt main()
{
char arr[] = {'a','b','c','d','e','f'};
printf("%d\n", strlen(arr));
printf("%d\n", strlen(arr+0));
printf("%d\n", strlen(*arr));
printf("%d\n", strlen(arr[1]));
printf("%d\n", strlen(&arr));
printf("%d\n", strlen(&arr+1));
printf("%d\n", strlen(&arr[0]+1));

}

当你做完后打开程序运行一下为什么只会打印两个答案呢?

这时候你可以调试一下找结果,发现了程序崩溃 那是为什么呢?

这里我把代码中的截图下来 当然不容易懂 我也会把代码再下面上传的

当然我们把崩溃的代码注释掉,

这里的结果都是随机值

复制代码
#include <stdio.h>
#include<string.h> 
int main()
{
	char arr[] = { 'a','b','c','d','e','f' };
	printf("%zd\n", strlen(arr));//随机值
	printf("%zd\n", strlen(arr + 0));//随机值
	//printf("%zd\n", strlen(*arr));//arr首元素的地址,*arr是首元素内容 我们可以知道 a 是字符 ,转换为数字是ASALL码
	//a 是 97 这里的 97 当做地址程序直接会崩溃
	//printf("%zd\n", strlen(arr[1]));//与上面的原理一样 ,这里的arr [1] 是字符 'b ' 对应 98
	printf("%zd\n", strlen(&arr));//随机值 从首元素地址开始找 \0
	printf("%zd\n", strlen(&arr + 1));//随机值
	printf("%zd\n", strlen(&arr[0] + 1)); //随机值
	return 0;
}

下班 下次再续

相关推荐
寻丶幽风21 分钟前
论文阅读笔记——Generating Long Sequences with Sparse Transformers
论文阅读·笔记·语言模型·transformer·稀疏自注意力
Angindem22 分钟前
websoket 学习笔记
笔记·学习
双叶8361 小时前
(51单片机)点阵屏LED显示图片(点阵屏LED教程)(74Hc595教程)
c语言·开发语言·单片机·嵌入式硬件·51单片机
Better Rose4 小时前
【2025年认证杯数学中国数学建模网络挑战赛】A题 解题建模过程与模型代码(基于matlab)
c语言·数学建模·matlab
jackson凌5 小时前
【Java学习笔记】Java第一课,梦开始的地方!!!
java·笔记
大模型铲屎官5 小时前
# Unity动画控制核心:Animator状态机与C#脚本实战指南 (Day 29)
c语言·unity·c#·游戏引擎·游戏开发·动画控制·animator状态机
I like Code?5 小时前
AntVG2可视化学习与开发笔记-React19(持续更新)
javascript·笔记·学习
XW-ABAP6 小时前
c语言练习4
java·c语言·前端
那天的烟花雨7 小时前
android display 笔记(十一)surfaceflinger 如何将图层传到lcd驱动的呢?
android·笔记
你说你说你来说7 小时前
安卓开发Intent详细介绍和使用
android·笔记