✨个人主页: 熬夜学编程的小林
💗系列专栏: 【C语言详解】 【数据结构详解】
指针
1、sizeof和strlen的对比
1.1、sizeof
在学习操作符的时候,我们学习了 sizeof , sizeof 计算变量所占内存空间大小的 , 单位是
字节 ,如果操作数是类型的话,计算的是使用类型创建的变量所占内存空间的大小。
sizeof 只关注占注内存空间的大小,不在乎内存中存放什么数据。
比如:
#include <stdio.h>
int main()
{
int a = 10;
printf("%d\n", sizeof(a));
printf("%d\n", sizeof a);
printf("%d\n", sizeof(int));
return 0;
}
注:变量可以不加括号,类型必须加圆括号(小括号)。
1.2、strlen
strlen 是C语言库函数,功能是求字符串长度。函数原型如下:
size_t strlen ( const char * str );
注:strlen需要包含头文件#include<string.h>,可以在cplusplus旧版本搜索,前面函数章节有详细讲解查库函数的两个工具。
统计的是从 strlen 函数的参数 str 中这个地址开始向后, \0 之前字符串中字符的个数。
strlen 函数会⼀直向后找 \0 字符,直到找到为止,所以 可能存在越界查找。
#include<string.h>
#include <stdio.h>
int main()
{
char arr1[3] = {'a', 'b', 'c'};
char arr2[] = "abc";
printf("%d\n", strlen(arr1));
printf("%d\n", strlen(arr2));
printf("%d\n", sizeof(arr1));
printf("%d\n", sizeof(arr2));
return 0;
}
为什么strlen(arr1)是15呢?按照我们正常思维是不是应该为3呢?
那有uu会说为什么strlen(arr2)就是3呢?
为什么sizeof(arr2)是4呢?按照正常思维是不是应该为3呢?
1.3、sizeof 和 strlen的对比
sizeof |
strlen |
---|---|
1. sizeof是操作符 2. sizeof计算操作数所占内存的大小, 单位是字节 3. 不关注内存中存放什么数据 |
1. strlen是库函数,使用需要包含头⽂件 string.h 2. srtlen是求字符串长度的,统计的是 \0 之前字符的个数 3. 关注内存中是否有 \0 ,如果没有 \0 ,就会持续往后找,可能会越界 |
2、数组和指针笔试题解析
2.1、⼀维数组
int a[] = {1,2,3,4};
printf("%d\n",sizeof(a));
printf("%d\n",sizeof(a+0));
printf("%d\n",sizeof(*a));
printf("%d\n",sizeof(a+1));
printf("%d\n",sizeof(a[1]));
printf("%d\n",sizeof(&a));
printf("%d\n",sizeof(*&a));
printf("%d\n",sizeof(&a+1));
printf("%d\n",sizeof(&a[0]));
printf("%d\n",sizeof(&a[0]+1));
sizeof计算操作数所占内存的大小, 单位是字节
2.2、二维数组
int a[3][4] = {0};
printf("%d\n",sizeof(a));
printf("%d\n",sizeof(a[0][0]));
printf("%d\n",sizeof(a[0]));
printf("%d\n",sizeof(a[0]+1));
printf("%d\n",sizeof(*(a[0]+1)));
printf("%d\n",sizeof(a+1));
printf("%d\n",sizeof(*(a+1)));
printf("%d\n",sizeof(&a[0]+1));
printf("%d\n",sizeof(*(&a[0]+1)));
printf("%d\n",sizeof(*a));
printf("%d\n",sizeof(a[3]));
sizeof计算操作数所占内存的大小, 单位是字节
总结
本篇博客就结束啦,谢谢大家的观看,如果公主少年们有好的建议可以留言喔,谢谢大家啦!