一.彻底明白 sizeof 操作符 ,数组名,strlen 函数
1.数组名的意义
1. sizeof ( 数组名 ),这里的数组名表示的是整个数组 ,计算的是整个数组的大小;
2.&数组名 ,取出的是整个数组的地址,虽然与数组首元素地址的值相同,但意义却完全不同;
3.除此之外的其他所有情况数组名都表示数组首元素的地址。
2. sizeof 详解
1. sizeof 计算的是操作数的类型长度,单位是字节;
2. sizeof 返回的是无符号整型;
3. sizeof 计算的是操作数的类属性,而不是值属性,即 sizeof 内部的表达式不进行计算;
3.strlen详解
1.描述:
2.参数:
3.返回值:
4.所以 strlen 函数计算的是一个字符串的长度,不可以把参数写成字符或是其他的,且 strlen 遇到 '\0' 就结束了。
补充1:
表达式有两种属性:
1.值属性
2.类属性
补充2:
只要是地址, sizeof 计算时:
1. 32 位机器是4个字节;
2. 64 位机器是8个字节。
例:
3.数组名意义详细图解演示
二.关于 sizeof 的指针和数组笔试题讲解
T1.
1. //一维数组 2. int a[] = {1,2,3,4}; 3. 1. printf("%d\n",sizeof(a)); 4. 2. printf("%d\n",sizeof(a+0)); 5. 3. printf("%d\n",sizeof(*a)); 6. 4. printf("%d\n",sizeof(a+1)); 7. 5. printf("%d\n",sizeof(a[1])); 8. 6. printf("%d\n",sizeof(&a)); 9. 7. printf("%d\n",sizeof(*&a)); 10. 8. printf("%d\n",sizeof(&a+1)); 11. 9. printf("%d\n",sizeof(&a[0])); 12. 10. printf("%d\n",sizeof(&a[0]+1));
Q1:
sizeof 里只有单独一个数组名,所以 sizeof 计算的就是整个数组的大小,该数组有4个元素,每个元素的类型是 int ,所以整个数组的大小就是 16;
答案:16
Q2:
sizeof 里不是单独的数组名了,也不是&数组名,那么此时的数组名就表示数组首元素的地址,加上0,表示跳过0个字节,所以 a+0 表示的依然是首元素的地址,是地址那么如果是32位机器就是4,64位机器就是8;
答案:4/8
Q3:
sizeof 内部不是单独的数组名,也不是&数组名,那么此时的数组名就表示数组首元素的地址,对其解引用,就是数组首元素 1 ,类型是 int 所以答案是4;
答案 :4
Q4:
与上同理,此时的数组名表示的依然是数组首元素的地址,+1 表示下标为1的元素的地址,所以不是4就是8;
答案:4/8
Q5:
a[ 1 ]表示下标为1的元素,该数组元素类型为 int ,所以答案是4;
答案:4
Q6:
sizeof 内部是&a,表示的是整个数组的地址,是地址那么答案不是4就是8;
答案:4/8
Q7:
&a 取出了整个数组的地址,对其解引用就找到了整个数组,就相当于 * 和 & 相互抵消了,就相当于sizeof 内部只有一个单独的数组名,那么答案就是16;
答案:16
Q8 ,Q9 , Q10:
很明显,这三题 sizeof 内部的表达式都表达的是一个地址,那么答案为4或8;
Q8, Q9, Q10答案:4/8
32位机器打印结果:
T2.
1. //字符数组 2. char arr[] = {'a','b','c','d','e','f'}; 3. 1. printf("%d\n", sizeof(arr)); 4. 2. printf("%d\n", sizeof(arr+0)); 5. 3. printf("%d\n", sizeof(*arr)); 6. 4. printf("%d\n", sizeof(arr[1])); 7. 5. printf("%d\n", sizeof(&arr)); 8. 6. printf("%d\n", sizeof(&arr+1)); 9. 7. printf("%d\n", sizeof(&arr[0]+1));
有了上题的基础,这题做起来就很简单了。
Q1:
sizeof 内部只有单独一个数组名,即此时计算的是整个数组的大小;
注意:数组里的元素不是字符串,所以只存了 6 个元素,并没有 \0 存在
答案:6
Q2:
可以看出,sizeof 内部表示的是一个地址
答案:4/8
Q3:
此时数组名是数组首元素的地址,解引用即为数组的首元素,类型为 char
答案:1
Q4:
表示数组下标为1的元素,类型为 char
答案:1
Q5:
&arr 是一个地址,这就不用多说了
答案:4/8
Q6:
同样是地址,不过这表示的是:
答案:4/8
Q7:
仍然是一个地址,不过和上题的表示的意义不同: