sizeof是一个操作符,是用来计算变量(类型)所占内存空间的大小,不关注内存中存放的具体内容,单位是字节;sizeof这个操作符计算返回值的结果是size_t类型的,是无符号的整型。
strlen 是一个库函数,使用时要包含头文件#include <string.h>,是专门求字符串长度的,只针对字符串。从给定的地址向后一直找\0,统计\0之前出现的字符的个数
下面是对sizeof 和 strlen在数组中具体的列子:
//一维数组中
#include <stdio.h>
int main()
{
int a[] = { 1,2,3,4 };
printf("%d\n", sizeof(a));//16
//sizeof(数组名),数组名表示整个数组,计算的是整个数组的大小,单位是字节
printf("%d\n", sizeof(a + 0));//4/8
//注意:X86操作系统下,是4个字节;X64操作系统下,是8个字节。
printf("%d\n", sizeof(*a));//4
//*a=a[0],*a中的a是数组首元素地址
printf("%d\n", sizeof(a + 1));//4/8
printf("%d\n", sizeof(a[1]));//4
//计算第二个的大小
printf("%d\n", sizeof(&a));//4/8
//&a取出的是数组的地址,数组的地址,也就是地址
printf("%d\n", sizeof(*&a));//16
//&a拿到的是数组地址,数组地址解引用是数组;&和*抵消
printf("%d\n", sizeof(&a + 1));//4/8
//&a数组地址
//&a的类型是int(*)[4]
//&a+1是从数组a的地址向后跳过了4个整型元素的数组的大小
printf("%d\n", sizeof(&a[0]));//4/8
printf("%d\n", sizeof(&a[0] + 1));//4/8
//&a[0]+1是第二个元素的地址,大小是4或者8个字节
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/8
printf("%d\n", sizeof(*arr));//1
printf("%d\n", sizeof(arr[1]));//1
printf("%d\n", sizeof(&arr));//4/8
//整个数组的地址,是地址,所占内存4或者8个字节
printf("%d\n", sizeof(&arr + 1));//4/8
printf("%d\n", sizeof(&arr[0] + 1));//4/8
printf("%d\n", strlen(arr));//随机值
printf("%d\n", strlen(arr + 0));//随机值
printf("%d\n", strlen(*arr));//err
printf("%d\n", strlen(arr[1]));//err
printf("%d\n", strlen(&arr));//随机值
printf("%d\n", strlen(&arr + 1));//随机值-6;
printf("%d\n", strlen(&arr[0] + 1));//随机值-1;
#include <stdio.h>
int main()
{
char arr[] = "abcdef";
//arr[]={ a b c d e f g \0}
printf("%d\n", sizeof(arr));//7
printf("%d\n", sizeof(arr + 0));//4/8
printf("%d\n", sizeof(*arr));//1
printf("%d\n", sizeof(arr[1]));//1
printf("%d\n", sizeof(&arr));//4/8
printf("%d\n", sizeof(&arr + 1));//4/8
printf("%d\n", sizeof(&arr[0] + 1));//4/8
printf("%d\n", strlen(arr));//6
printf("%d\n", strlen(arr + 0));//6
printf("%d\n", strlen(*arr));//err
printf("%d\n", strlen(arr[1]));//err
printf("%d\n", strlen(&arr));//6
printf("%d\n", strlen(&arr + 1));//随机值
printf("%d\n", strlen(&arr[0] + 1));//5
return 0;
}
#include <stdio.h>
int main()
{
char* p = "abcdef";
printf("%d\n", sizeof(p));//4/8
printf("%d\n", sizeof(p + 1));//4/8
printf("%d\n", sizeof(*p));//1
printf("%d\n", sizeof(p[0]));//1
printf("%d\n", sizeof(&p));//4/8
printf("%d\n", sizeof(&p + 1));//4/8
printf("%d\n", sizeof(&p[0] + 1));//4/8
printf("%d\n", strlen(p));//6
printf("%d\n", strlen(p + 1));//5
printf("%d\n", strlen(*p));//err
printf("%d\n", strlen(p[0]));//err
printf("%d\n", strlen(&p));//随机值
printf("%d\n", strlen(&p + 1));//随机值
printf("%d\n", strlen(&p[0] + 1));//5
return 0;
}
//二维数组中
#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
//a[0]是第一行这一个一维数组的数组名,单独放在sizeof内部,a[0]表示第一个整个一维数组,计算的就是第一行的大小;
printf("%d\n", sizeof(a[0] + 1));//4/8
//a[0]+1就是第一行第二个元素的地址;
printf("%d\n", sizeof(*(a[0] + 1)));//4
//*(a[0]+1)就是第一行第二个元素;
printf("%d\n", sizeof(a + 1));//4/8
//a虽然是二维数组的地址,但是没有单独放在sizeof内部,也没有区地址;a表示首元素地址,二维数组首元素地址是它的第一行,a就是第一行的地址;a+1就是跳过第一行,表示第二行的地址;
printf("%d\n", sizeof(*(a + 1)));//16
printf("%d\n", sizeof(&a[0] + 1));//4/8
//&a[0]是对第一行的数组名取地址,拿到的是第一行的地址
//&a[0]+1得到的是第二行的地址;
printf("%d\n", sizeof(*(&a[0] + 1)));//16
printf("%d\n", sizeof(*a));//16
printf("%d\n", sizeof(a[3]));//16
return 0;
}