目录
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;
}
下班 下次再续