sizeof
首先sizeof并非为一个函数,而是C语言中的一个关键字。
sizeof计算对象所占内存的大小,判断操作数的类型长度,以字节为单位;
指针在32位系统占4个字节,在64位系统占8个字节,本实例都在32位机器上操作。
sizeof 求大小看的仅仅是它的类型大小,而非其他。所以我们在计算时只要认清楚它的类型大小就行。
arr 和 &arr 的区别.
int arr[10] = { 0 );
arr -> 本意为数组arr 的第一个元素的地址,但是在 sizeof (arr) 中被特殊化为求整个数组 arr 的大小(这是一个特例),所以 sizeof (arr) = 40;
&arr -> 意思为整个数组的内存地址,所以 sizeof (&arr) = 4;(因为它是一个数组指针)
arr + 1 和 &arr + 1 的区别
arr 为首元素的地址 *,arr + 1 -> 即加了一个int * (4)的大小.
&arr 为数组的地址, 数组的地址 + 1 -> 即跳过了整个数组的大小,所以相当于加了 40;
<1>
char arr[] = { 'a', 'b', 'c', 'd' }; 1. printf("%d\n", sizeof(arr)); //4 2. printf("%d\n", sizeof(arr + 0)); //4 3. printf("%d\n", sizeof(*arr)); //1 4. printf("%d\n", sizeof(arr + 1)); //4 5. printf("%d\n", sizeof(arr[1])); //1 6. printf("%d\n", sizeof(&arr)); //4 7. printf("%d\n", sizeof(*&arr)); //4 8. printf("%d\n", sizeof(&arr + 1)); //4 9. printf("%d\n", sizeof(&arr[0])); //4 10. printf("%d\n", sizeof(&arr[0] + 1)); //4
- 整个数组的大小(特例)= 4
- 数组首元素的地址,类型为 char* = 4
- 数组首元素,类型为 char = 1
- 数组第二个元素的地址, 类型为 char* = 4
- 同3
- 数组的地址,类型为char (*) [4] = 4
- 先求数组地址,在解应用,相当于求数组大小,同1
- 取数组地址再 + 1 ,相当于跳过整个数组,类型为 char (*)[4] = 4
- 数组首元素的地址, 类型为 char * = 4
- 数组第二个元素的地址,类型为 char * = 4
<2>
char arr[] = "abcd"; printf("%d\n", sizeof(arr)); //5 printf("%d\n", sizeof(*&arr)); //5
别忘了这种初始化模式系统会默认给末尾补一个 '\0',所以是5, 其他的和<1> 是一样的。
strlen
strlen 是库函数,使用时须引用其头文件 <string.h>
它的格式为 size_t strlen(const char * str); (必须传 const char * 类型的指针)
<1>
char arr[] = { 'a', 'b', 'c', 'd' }; char arr[] = { 'a', 'b', 'c', 'd', '\0' }; //自己添加 '\0' 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)); //随机值
出现随机值的原因是这样定义的数组后面没有 '\0',,所以 strlen 不能精确判断结束条件,有可能在超出数组很多后才停止。要想避免上述情况,建议用下面的方式进行初始化,或者自己在字符末尾加上 '\0', 加上后的效果和 <2> 是一样的.
<2>
char arr[] = "abcd"; 1. printf("%d\n", strlen(arr)); // 4 2. printf("%d\n", strlen(arr + 0)); //4 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)); // 3
这种定义方式系统会自动在字符串的末尾位置添加 '\0',所以不会出现随机值的问题。