sizeof和strlen的对比
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;
}
strlen
strlen 是C语言库函数,功能是求字符串长度。函数原型如下:
size_t strlen ( const char * str );
统计的是从 strlen 函数的参数 str 中这个地址开始向后, \0 之前字符串中字符的个数。
strlen 函数会一直向后找 \0 字符,直到找到为止,所以可能存在越界查找。
#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(arr1));
return 0;
}
sizeof 和 strlen的对比
sizeof
1. sizeof是操作符
2. sizeof计算操作数所占内存的⼤⼩,单位是字节
3. 不关注内存中存放什么数据
strlen
1. strlen是库函数,使⽤需要包含头⽂件 string.h
2. srtlen是求字符串⻓度的,统计的是 \0 之前字符的隔个数
3. 关注内存中是否有 \0 ,如果没有 \0 ,就会持续往后找,可能会越界
数组和指针笔试题解析
一维数组
int a[] = {1,2,3,4};
printf("%d\n",sizeof(a)); //16
//sizeof(数组名)的情况,计算的是整个数组大小
printf("%d\n",sizeof(a+0)); // 4/8
//a表示的就是数组首元素地址,a+0还是首元素
printf("%d\n",sizeof(* &a)); //16
//1.&与 * 抵消
//2.&a的类型为数组指针,int(*)[4],*&a就是对数组指针解引用后访问一个数组大小
字符数组
char arr[]="a,b,c,d,e,f"
printf("%zd\n",strlen(*arr));
//传递的是'a'-97 //arr
printf("%zd\n",strlen(%arr)); //6
//arr虽然是数组地址,但是也指向数组起始位置
printf("%zd\n",strlen(&arr+1));
//随机值
二维数组
int a[3][4] = {0};
printf("%d\n",sizeof(a));
//12*4=48个字节,数组名也被单独放在sizeof
printf("%d\n",sizeof(a[0]+1));
//a[0]+1即为&a[0][1]
printf("%d\n",sizeof(a+1));
//这里的a是数组首元素地址吗,应该是第一行的地址,则a+1是第二行的地址
printf("%d\n",sizeof(*a));
//*a--> *(a+0)--> a[0]
printf("%d\n",sizeof(a[3]))
//这里不存在越界
//因为sizeof内部表达式不会真实计算,只会根据其类型计算大小,并不会真实计算
总结
数组名的意义:
- sizeof(数组名),这里的数组名表⽰整个数组,计算的是整个数组的大小。
- &数组名,这里的数组名表示整个数组,取出的是整个数组的地址。
- 除此之外所有的数组名都表示首元素的地址