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
  1. 整个数组的大小(特例)= 4
  2. 数组首元素的地址,类型为 char* = 4
  3. 数组首元素,类型为 char = 1
  4. 数组第二个元素的地址, 类型为 char* = 4
  5. 同3
  6. 数组的地址,类型为char (*) [4] = 4
  7. 先求数组地址,在解应用,相当于求数组大小,同1
  8. 取数组地址再 + 1 ,相当于跳过整个数组,类型为 char (*)[4] = 4
  9. 数组首元素的地址, 类型为 char * = 4
  10. 数组第二个元素的地址,类型为 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',所以不会出现随机值的问题。