愿所有美好如期而遇
数组名在寻常情况下表示首元素地址,但有两种情况例外:
1.sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组的大小
2.&数组名,这里的数组名表示整个数组,取出的是整个数组的地址
3.sizeof是操作符,不是函数,并且sizeof不计算括号里的表达式,他会在编译阶段检查括号里的表达式的类型属性,计算出大小。(任何表达式都有两种属性,值属性和类型属性,
int a = 3; short b = 2; b = a + b;这个表达式的值属性就是5,类型属性就是short)
- char arr[] = "abcdef";
-
- printf("%d\n", sizeof(arr));
- printf("%d\n", sizeof(arr+0));
- printf("%d\n", sizeof(*arr));
- printf("%d\n", sizeof(arr[1]));
- printf("%d\n", sizeof(&arr));
- printf("%d\n", sizeof(&arr+1));
- printf("%d\n", sizeof(&arr[0]+1));
-
- printf("%d\n", strlen(arr));
- printf("%d\n", strlen(arr+0));
- printf("%d\n", strlen(*arr));
- printf("%d\n", strlen(arr[1]));
- printf("%d\n", strlen(&arr));
- printf("%d\n", strlen(&arr+1));
- printf("%d\n", strlen(&arr[0]+1));
7 8 1 1 8 8 8
6 6 error error 6 随机值 5
(博主用的是64位机器,所以地址占的空间大小为8字节,如果得4的话,是32位机器)
- char arr[] = "abcdef";
-
- printf("%d\n", sizeof(arr));
- //sizeof(数组名),计算整个数组的大小,
- //字符串结尾还有\0占一个字节的空间,共7个字节
-
- printf("%d\n", sizeof(arr + 0));
- //类比arr+1,这里的arr代表数组首元素地址,所以4/8
-
- printf("%d\n", sizeof(*arr));
- //*arr访问的是char类型的数据,1个字节
-
- printf("%d\n", sizeof(arr[1]));
- //第二个元素,数据类型为char,1个字节
-
- printf("%d\n", sizeof(&arr));
- //&arr,指针类型为数组指针,此时取出的是整个数组的地址,
- //但归根结底还是指针,占4/8个字节
-
- printf("%d\n", sizeof(&arr + 1));
- //数组指针向后走一个指针的距离,4/8
-
- printf("%d\n", sizeof(&arr[0] + 1));
- //指向第二个元素,4/8
-
- //-------------------------------------------------------------------
- //-------------------------------------------------------------------
-
- //strlen是计算字符串长度的哦
- printf("%d\n", strlen(arr));
- //strlen遇到\0停止,所以得6
-
- printf("%d\n", strlen(arr + 0));
- //相同道理,6
-
- printf("%d\n", strlen(*arr));
- //error, *arr是'a',ASCII值为97,当做地址传入strlen,
- //成为野指针非法访问
-
- printf("%d\n", strlen(arr[1]));
- //error, 'b'也同理
-
- printf("%d\n", strlen(&arr));
- //&arr与arr地址相同,尽管其意义不同,
- //&arr指针类型为数组指针,会被转换成strlen接受的指针类型,
- //所以我们最终得到的还是6
-
- printf("%d\n", strlen(&arr + 1));
- //随机值,&arr+1跳过的是整个数组,所以我们无法判断何时会
- //再遇见\0,。
-
- printf("%d\n", strlen(&arr[0] + 1));
- //指向第二个元素,所以得到5