一、sizeof 和strlen 比较
sizeof | strlen |
---|---|
1. sizeof 是操作符 | 1. strlen是库函数,使用需要包含头⽂件 string.h |
2. sizeof 计算操作数所占内存的大小,单位是字节 | 2. srtlen是求字符串长度的,统计的是 \0 之前字符的隔个数 |
3. 不关注内存中存放什么数据 | 3. 关注内存中是否有 \0 ,如果没有 \0 ,就会持续往后找,可能会越界 |
二、例题
2.1 一维数组
int a[] = {1,2,3,4};
printf("%d\n",sizeof(a)); //16
printf("%d\n",sizeof(a+0)); //4/8
printf("%d\n",sizeof(*a)); //4
printf("%d\n",sizeof(a+1)); //4/8
printf("%d\n",sizeof(a[1])); //4
printf("%d\n",sizeof(&a)); //4/8
printf("%d\n",sizeof(*&a)); //16
printf("%d\n",sizeof(&a+1)); //4/8
printf("%d\n",sizeof(&a[0])); //4/8
printf("%d\n",sizeof(&a[0]+1)); //4/8
2.2 字符数组
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
printf("%d\n", sizeof(&arr+1)); //4/8
printf("%d\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)); //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)); //随机值
char arr[] = "abcdef";
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
char arr[] = "abcdef";
printf("%d\n", strlen(arr)); //6
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
printf("%d\n", strlen(&arr+1)); //随机值
printf("%d\n", strlen(&arr[0]+1)); //5
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
char *p = "abcdef";
printf("%d\n", strlen(p)); //6
printf("%d\n", strlen(p+1)); //5
//printf("%d\n", strlen(*p)); //error
//printf("%d\n", strlen(p[0])); //error
printf("%d\n", strlen(&p)); //6
printf("%d\n", strlen(&p+1)); //随机值
printf("%d\n", strlen(&p[0]+1));//5
2.3 二维数组
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/8
printf("%d\n", sizeof(*(a[0] + 1))); //4
printf("%d\n", sizeof(a + 1)); //4/8
printf("%d\n", sizeof(*(a + 1))); //16
printf("%d\n", sizeof(&a[0] + 1)); //4/8
printf("%d\n", sizeof(*(&a[0] + 1))); //16
printf("%d\n", sizeof(*a)); //16
printf("%d\n", sizeof(a[3])); //16
数组名的意义:
- sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组的大小
- &数组名,这里的数组名表示整个数组,取出的是整个数组的地址。
- 除此之外所有的数组名都表示首元素的地址。