一、sizeof与strlen的对比
sizeof | strlen |
sizeof是单目操作符 | strlen是库函数,使用需要包含头文件string.h |
sizeof计算操作数所占用的内存,单位是字节 | strlen是求字符串长度,统计的是\0之前字符的个数 |
不关注内存中存放什么数据 | 关注内存总是否有\0,如果没有就会持续 往后找,甚至越界 |
sizeof不挑类型 | 指针针对字符串 |
strlen是指针且针对字符串,strlen 原型是size_t strlen(const char *str);
数组名:数组名一般表示数组首元素地址但有两个例外;
1.siziof(数组名):数组名表示整个数组,计算的是整个数组的大小,单位字节。
2.&数组名:数组名表示整个数组,取出的是整个数组的地址。
指针的大小:指针在x86环境下大小为4,在x64环境下为8,单位字节。
int main()
{
int a[] = { 1, 2, 3, 4 };//arr数组中有四个元素每个元素都是int类型(占四个字节)
printf("%zd\n", sizeof(a));//sizeof(a)取出的是整个数组的大小16
printf("%zd\n", sizeof(a+0));//a+0中的a数组名表示数组首元素地址,地址即指针,指针大小4/8
printf("%zd\n", sizeof(*a));//数组首元素地址解引用,表示数组首元素,4
printf("%zd\n", sizeof(a+1));//第二个元素的地址,4/8
printf("%zd\n", sizeof(a[1]));//第二个元素,4
printf("%zd\n", sizeof(&a));//整个数组的地址,地址即指针4/8
printf("%zd\n", sizeof(&a + 1));//地址,4/8
printf("%zd\n", sizeof(&a[0]));//取出数组首元素地址,4/8
printf("%zd\n", sizeof(&a[0] + 1));//数组第二个元素的地址4/8
return 0;
}
char arr[] = { 'a','b', 'c', 'd', 'e', 'f' };
printf("%zd\n", sizeof(arr));//整个数组的大小6
printf("%zd\n", sizeof(arr + 0));//指针4/8
printf("%zd\n", sizeof(*arr));//数组首元素,
printf("%zd\n", sizeof(arr + 1));//第二个元素的地址,4/8
printf("%zd\n", sizeof(arr[1]));//第二个元素,1
printf("%zd\n", sizeof(&arr));//整个数组的地址,地址即指针4/8
printf("%zd\n", sizeof(&arr + 1));//地址,4/8
printf("%zd\n", sizeof(&arr[0] + 1));//数组第二个元素的地址4/8
char arr[] = { 'a','b', 'c', 'd', 'e', 'f' };printf("%d\n", strlen(arr));//随机
printf("%d\n", strlen(arr+0));//随机
//printf("%d\n", strlen(*arr));//err
printf("%d\n", strlen(arr+1));//随机