sizeof strlen
sizeof():简单的说其作用就是返回一个对象或者类型所占的内存字节数。
strlen():用来计算指定的字符串s 的长度,不包括结束字符"\0"。
这里分别从一维数组,字符数组,二维数组中sizeof与strlen的运用实例来进行分析。
1)一维数组
int main()
{
int a[] = {1,2,3,4};
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)字符数组
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)); //随机值 从首元素地址开始,向后找'\0'
printf("%d\n", strlen(arr+0)); //随机值
//printf("%d\n", strlen(*arr)); //error 把字符a传入
//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;
}
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 把字符a传入
//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;
}
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 传入a字符
//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)二维数组
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;
}
注:数组名代表整个数组的时候只有两种情况,
sizeof(数组名),这里的数组名表示整个数组。
&数组名,这里的数组名表示整个数组。