指针(7)

目录

1. sizeof和strlen的对⽐

1.1 sizeof

1.2 strlen

sizeof 和 strlen  总结:

 2. 数组和指针

2.1 ⼀维数组

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;
}

下班 下次再续

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值