指针(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;
}

下班 下次再续

相关推荐
huangkj-henan1 小时前
DA217应用笔记
笔记
Young_202202021 小时前
学习笔记——KMP
笔记·学习
ChoSeitaku1 小时前
链表循环及差集相关算法题|判断循环双链表是否对称|两循环单链表合并成循环链表|使双向循环链表有序|单循环链表改双向循环链表|两链表的差集(C)
c语言·算法·链表
DdddJMs__1351 小时前
C语言 | Leetcode C语言题解之第557题反转字符串中的单词III
c语言·leetcode·题解
秀儿还能再秀2 小时前
机器学习——简单线性回归、逻辑回归
笔记·python·学习·机器学习
WCF向光而行2 小时前
Getting accurate time estimates from your tea(从您的团队获得准确的时间估计)
笔记·学习
娃娃丢没有坏心思2 小时前
C++20 概念与约束(2)—— 初识概念与约束
c语言·c++·现代c++
ahadee3 小时前
蓝桥杯每日真题 - 第11天
c语言·vscode·算法·蓝桥杯
Li_0304064 小时前
Java第十四天(实训学习整理资料(十三)Java网络编程)
java·网络·笔记·学习·计算机网络
啤酒泡泡_Lyla4 小时前
现代无线通信接收机架构:超外差、零中频与低中频的比较分析
笔记·信息与通信