注意
- sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组的大小。
- &数组名,这里的数组名表示整个数组,取出的是整个数组的地址。
- 除此之外所有的数组名都表示首元素的地址。
本章所有题目均在32位机下进行
一维数组
code1
#include<stdio.h>
#include<string.h>
int main()
{
int a[] = {
1,2,3,4};
printf("%d\n",sizeof(a));
printf("%d\n",sizeof(a+0));
printf("%d\n",sizeof(*a));
printf("%d\n",sizeof(a+1));
printf("%d\n",sizeof(a[1]));
printf("%d\n",sizeof(&a));
printf("%d\n",sizeof(*&a));
printf("%d\n",sizeof(&a+1));
printf("%d\n",sizeof(&a[0]));
printf("%d\n",sizeof(&a[0]+1));
return 0;
}
解析:
1.
sizeof(a);
16 - sizeof(数组名) - 计算的是数组总大小 - 单位是字节
2.sizeof(a+0);
4 - 数组名表示首元素地址,a+0还是首元素地址,地址的大小就是4个字节
3.sizeof(*a);
4 - 数组名表示首元素地址,*a就是首元素,sizeof(*a)就是4
4.sizeof(a+1);
4 - 数组名表示首元素地址,a+1是第2个元素地址,地址的大小就是4个字节
5.sizeof(a[1]);
4 - 第2个元素的大小
6.sizeof(&));
4 - &a取出的是数组的地址,但是数组的地址那也是地址,地址的大小就是4个字节
7.sizeof(*&a);
16 - &a数组的地址,数组的地址解引用访问数组,sizeof计算的就是数组的大小,单位字节
8.sizeof(&a+1);
4 - &a是数组的地址,&a+1地址跳过整个数组,但还是地址,所以是4个字节
9.sizeof(&a[0]);
4 - &a[0] 首元素的地址
10.sizeof(&a[0]+1);
4 - &a[0]+1是第2个元素的地址
字符数组
code2
#include<stdio.h>
#include<string.h>
int main()
{
char arr[] = {
'a','b','c','d','e','f' };
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));
return 0;
}
解析:
1.
sizeof(arr);
6 - sizeof计算的是数组大小,6*1=6个字节
2.sizeof(arr + 0);
4 - arr是首元素的地址, arr+0还是首元素的地址`3.
sizeof(*arr);
1 - arr是首元素地址,*arr就是首元素,首元素是字符,大小是一个字节
4.sizeof(arr[1]);
1 - 第2个元素的大小
5.sizeof(&arr);
4 - &arr虽然是数组地址,但还是地址,地址大小是4个字节
6.sizeof(&arr + 1);
4 - &arr+1是跳过整个数组后的地址,地址大小是4个字节
7.sizeof(&arr[0] + 1);
4 - 第2个元素的地址
code3
iont main()
{
char arr[] = {
'a','b','c','d','e','f' };
printf("%d\n", strlen(arr));