sizeof strlen
sizeof(): 返回一个对象或者类型所占的内存字节数。
strlen(): 用来计算字符串的长度,遇到"\0"结束。
我们分别从一维数组,字符数组,二维数组的例子来分析。
注:数组名代表整个数组的时候只有两种情况
sizeof(数组名):数组名单独在sizeof中时表示整个数组。
&数组名:这里的数组名表示整个数组。
1.一维数组。
#include <stdio.h>
int main()
{
int a[]={0,1,2,3};
printf("%d\n",sizeof(a));// 16 整个数组的大小
printf("%d\n",sizeof(a+0));// 4 首元素地址
printf("%d\n",sizeof(*a)); // 4 首元素
printf("%d\n",sizeof(a+1));// 4 第二个元素的地址
printf("%d\n",sizeof(a[1]));//4 第二个元素
printf("%d\n",sizeof(&a)); // 4 数组的地址
printf("%d\n",sizeof(*&a));// 16 数组的地址解引用,表示整个数组
printf("%d\n",sizeof(&a+1));// 4 跳过整个数组,指向数组后面的一个地址
printf("%d\n",sizeof(&a[0]));//4 首元素地址
printf("%d\n",sizeof(&a[0]+1));//4 第二个元素的地址
return 0;
}
2.字符数组。
#include <stdio.h>
int main()
{
char* p="abcdef";
printf("%d\n",sizeof(p));//4 元素a的地址
printf("%d\n",sizeof(p+1));//4 元素b的地址
printf("%d\n",sizeof(*p));//1 解引用为指向一个字符的大小
printf("%d\n",sizeof(p[0]));//1 首元素
printf("%d\n",sizeof(&p));//4 p的地址
printf("%d\n",sizeof(&p+1));//4 p之后的地址
printf("%d\n",sizeof(&p[0]+1));//4 指向b的地址
printf("%d\n",strlen(p));//6 从a开始字符串的长度
printf("%d\n",strlen(p+1));//5 从b开始字符串的长度
//printf("%d\n",strlen(*p));// error
//printf("%d\n",strlen(p[0]));//error
printf("%d\n",strlen(&p)); //随机值
printf("%d\n",strlen(&p+1)); //随机值
printf("%d\n",strlen(&p[0]+1)); //5 从b开始找
return 0;
}
#include <stdio.h>
int main()
{
char arr[]={'a','b','c','d','e','f'};
printf("%d\n",sizeof(arr));//6 整个数组大小
printf("%d\n",sizeof(arr+0));//4 首元素的地址
printf("%d\n",sizeof(*arr));//1 首元素大小
printf("%d\n",sizeof(arr[1]));//1 第二个元素
printf("%d\n",sizeof(&arr));//4 数组的地址
printf("%d\n",sizeof(&arr+1));//4 整个数组之后的地址
printf("%d\n",sizeof(&arr[0]+1));//4 第二个元素的地址
printf("%d\n",strlen(arr));//随机值
printf("%d\n",strlen(arr+0));//随机值
//printf("%d\n",strlen(*arr));// error
//printf("%d\n",strlen(arr[1]));//error
printf("%d\n",strlen(&arr)); //随机值
printf("%d\n",strlen(&arr+1)); //随机值
printf("%d\n",strlen(&arr[0]+1)); //随机值
return 0;
}
#include <stdio.h>
int main()
{
char arr[]="abcdef";
printf("%d\n",sizeof(arr));//7 整个数组大小
printf("%d\n",sizeof(arr+0));//4 首元素的地址
printf("%d\n",sizeof(*arr));//1 首元素大小
printf("%d\n",sizeof(arr[1]));//1 第二个元素
printf("%d\n",sizeof(&arr));//4 数组的地址
printf("%d\n",sizeof(&arr+1));//4 整个数组之后的地址
printf("%d\n",sizeof(&arr[0]+1));//4 第二个元素的地址
printf("%d\n",strlen(arr));//6 从a开始找
printf("%d\n",strlen(arr+0));// 6
//printf("%d\n",strlen(*arr));// error
//printf("%d\n",strlen(arr[1]));//error
printf("%d\n",strlen(&arr)); // 6 从a开始找
printf("%d\n",strlen(&arr+1)); //随机值
printf("%d\n",strlen(&arr[0]+1));//5从b开始找
return 0;
}
3.二维数组。
#include <stdio.h>
int main()
{
int a[3][4]={0};
printf("%d\n",sizeof(a));//48 整个数组大小
printf("%d\n",sizeof(a[0][0]));//4 首元素
printf("%d\n",sizeof(a[0]));//16 第一行元素
printf("%d\n",sizeof(a[0]+1));//4 第一行元素的第二个地址
printf("%d\n",sizeof(a+1));//4 第二行地址
printf("%d\n",sizeof(&a[0]+1));//4 第二行地址
printf("%d\n",sizeof(*a));//16 第一行
printf("%d\n",sizeof(*&a));//48 整个数组
printf("%d\n",sizeof(a[3]));//16 第四行
return 0;
}