1.strlen()是一个函数,sizeof()是操作符
2.strlen()中必须存放地址,若存放的是一个常量,则会报错,其工作原理是从地址开始到'\0'结束,而返回结果不包括’\0’;
sizeof()中可存放如下:
- 数组:编译时分配的数组空间大小
- 指针:存储该指针所用的空间大小(存储该指针的地址的长度,是长整型,应该为4)
- 类型:该类型所占的空间大小
- 对象:对象的实际占用空间大小
- 函数:函数的返回类型所占的空间大小.函数的返回类型不能是void
3.编译器在编译时就计算出了sizeof的结果,而strlen函数必须在运行时才能计算出来.并且sizeof计算的是数据类型占内存的大小,而strlen计算的是字符串实际的长度.
题目练习+答案:
//一维数组
int a[] = {1,2,3,4};
printf("%d\n",sizeof(a)); ——16
printf("%d\n",sizeof(a+0));——4或8(X86和X64CPU的位数来决定)
printf("%d\n",sizeof(*a));——4(int型变量)
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
//字符数组
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));——err
printf("%d\n", strlen(arr[1]));——err
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
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
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
//二维数组
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
//a[3]是二维数组的第4行,虽然没有第四行,但是类型能够确定,大小就是确定的。大小就是一行的大小,单位是字节 - 16
// //能够分析出 a[3]的类型是:int [4]
总结:
数组名的意义:
- sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组的大小。
- &数组名,这里的数组名表示整个数组,取出的是整个数组的地址。
- 除此之外所有的数组名都表示首元素的地址。