文章目录
#include
#include
int main()
{
char a[] = "abcdef";
printf("%d\n", sizeof(a));
printf("%d\n", strlen(a));
return 0;
}
由此可见sizeof未去除'\0',strlen自动去除了'\0'。
结果为
由此可见,s在sizeof内部并没有进行计算。
代码如下(示例):
#include
#include
int main()
{
int a[] = { 1, 2, 3, 4 };
//1.
printf("%d\n", sizeof(a));
//2.
printf("%d\n", sizeof(a + 0));
//3.
printf("%d\n", sizeof(*a));
//4.
printf("%d\n", sizeof(a + 1));
//5.
printf("%d\n", sizeof(a[1]));
//6.
printf("%d\n", sizeof(&a));
//7.
printf("%d\n", sizeof(*&a));
//8.
printf("%d\n", sizeof(&a + 1));
//9.
printf("%d\n", sizeof(&a[0]));
//10.
printf("%d\n", sizeof(&a[0] + 1));
return 0;
}
结果为
注意1与2的区别 sizeof(a)计算的是整个数组的大小,这其中的a表示的是整个数组
而sizeof(a+0)计算的是a[1]的地址大小,这其中的a表示的首元素地址
总的来说,数组只有单独出现的sizeof()中才表示为整个元素
其中2 4 6 8 9 10计算的是指针的大小,根据不同位数的平台的大小不同,在32位平台中大小为4,在64位平台中大小为8
其中第八组较为特殊,&a+1,&a表示整个数组的地址,以int a[5] ; &a+1;为例&a+1这个+1是在整个数组的维度上,所以&a+1是往后走了20个字节。而a+1则是往后走了一个字节。但是它终究只是个地址,所以sizeof结果仍然为4
sizeof
#include
#include
int main()
{
char arr[] = { 'a', 'b', 'c', 'd', 'e', 'f' };
printf("%d\n", sizeof(arr));
printf("%d\n", sizeof(arr + 0));
printf("%d\n", sizeof(*arr));
printf("%d\n", sizeof(arr[1]));
printf("%d\n", sizeof(&arr));
printf("%d\n", sizeof(&arr + 1));
printf("%d\n", sizeof(&arr[0] + 1));
return 0;
}
因为char类型只占一个字节所以3 4答案为1
strlen
#include
#include
int main()
{
char arr[] = { 'a', 'b', 'c', 'd', 'e', 'f' };
//1.
printf("%d\n", strlen(arr));
//2.
printf("%d\n", strlen(arr + 0));
//3.
printf("%d\n", strlen(*arr));
//4.
printf("%d\n", strlen(arr[1]));
//5.
printf("%d\n", strlen(&arr));
//6.
printf("%d\n", strlen(&arr + 1));
//7.
printf("%d\n", strlen(&arr[0] + 1));
return 0;
}
重点来了,首先要搞清楚{‘a’,'b','c','d','e','f'}与"abcdef"的区别
{‘a’,'b','c','d','e','f'}数组在末尾结束时候不会自动添加'\0'收尾
相反"abcdef"在结尾时会自动添加'\0'收尾。
根据我们所学的知识可知strlen计算的大小的原理是指针碰到'\0'的地址时自动停止,由此有两种问题
所以我们在运行这段代码时要将第3、4组屏蔽掉。
其他所有组的结果都为随机值,因为没有在结尾添加'\0'。
第1,2,3组的结果相同,都为一个随机值。
其中第6组为随机值-6。因为&a+1在a数组的基础上向后移动了6个字节
第7组为随机值随机值-1
sizeof
int main()
{
char arr[] = "abcdef";
//1
printf("%d\n", sizeof(arr));
//2
printf("%d\n", sizeof(arr + 0));
//3
printf("%d\n", sizeof(*arr));
//4
printf("%d\n", sizeof(arr[1]));
//5
printf("%d\n", sizeof(&arr));
//6
printf("%d\n", sizeof(&arr + 1));
//7
printf("%d\n", sizeof(&arr[0] + 1));
return 0;
}
具体参考上面的sizeof,唯一要注意的是"abcdef"类型在结尾添加了'\0',因为sizeof不会自动去除"\0"所以第1组的结果是7而不是6
结果如下
strlen
int main()
{
char arr[] = "abcdef";
//1
printf("%d\n", strlen(arr));
//2
printf("%d\n", strlen(arr + 0));
//3
printf("%d\n", strlen(*arr));
//4
printf("%d\n", strlen(arr[1]));
//5
printf("%d\n", strlen(&arr));
//6
printf("%d\n", strlen(&arr + 1));
//7
printf("%d\n", strlen(&arr[0] + 1));
return 0;
}
结果如下
#include
#include
int main()
{
int a[3][4] = { 0 };
//1
printf("%d\n", sizeof(a));//48
//2
printf("%d\n", sizeof(a[0][0]));//4
//3
printf("%d\n", sizeof(a[0]));//16
//4
printf("%d\n", sizeof(a[0] + 1));//4
//5
printf("%d\n", sizeof(*(a[0] + 1)));//4
//6
printf("%d\n", sizeof(a + 1));//4
//7
printf("%d\n", sizeof(*(a + 1)));//16
//8
printf("%d\n", sizeof(&a[0] + 1));//4
//9
printf("%d\n", sizeof(*(&a[0] + 1)));//16
//10
printf("%d\n", sizeof(*a));//16
//11
printf("%d\n", sizeof(a[3]));//16
return 0;
}
结果为
小白新手之作,希望您看了这篇之后有所收获,本文还存在着瑕疵不足,有问题请您指出。谢谢观看!