❗注意:地址内存大小在x64环境下是8个字节,在x86环境下是4个字节
不同的环境对类型的大小无影响
1.一维数组
#include<stdio.h>
int main()
{
int a[] = { 1,2,3,4 };
printf("%d\n",sizeof(a));
//16 //整个数组的内存大小
printf("%d\n",sizeof(a+0));
//4或8 //a表示数组首元素地址,则计算首元素地址内存大小 a+0==&a[0]
printf("%d\n",sizeof(*a));
//4 //*a==a[0] 第一个元素内存大小
printf("%d\n",sizeof(a+1));
//4或8 //第二个元素地址内存大小 a+1==&a[1]
printf("%d\n",sizeof(a[1]));
//4 //第2个元素内存大小
printf("%d\n",sizeof(&a));
//4或8 //&a整个数组地址 计算整个数组地址内存大小
printf("%d\n",sizeof(*&a));
//16 //整个数组内存大小
printf("%d\n",sizeof(&a+1));
//4或8 //跳过整个数组后的地址内存大小
printf("%d\n",sizeof(&a[0]));
//4或8 //首元素地址内存大小
printf("%d\n",sizeof(&a[0]+1));
//4或8 //跳过第一个元素地址内存大小==第二个元素地址内存大小
return 0;
}
2.字符数组
int main()
{
char arr[] = { 'a','b','c','d','e','f' };
printf("%d\n",sizeof(arr));
//6 //整个数组内存大小
printf("%d\n", sizeof(arr + 0));
//4或8 //arr是首元素地址 计算的是首元素地址内存大小
printf("%d\n",sizeof(*arr));
//1 //*arr==arr[0] 计算的是首元素内存大小
printf("%d\n",sizeof(arr[1]));
//1 //计算第二个元素内存大小
printf("%d\n",sizeof(&arr));
//4或8 //计算整个数组地址内存大小
printf("%d\n",sizeof(&arr+1));
//4或8 //跳过整个数组后的地址内存大小
printf("%d\n",sizeof(&arr[0]+1));
//4或8 //跳过第一个数组后的地址内存大小==第二个数组地址内存大小
return 0;
}
int main()
{
char arr[] = "abcdef";
printf("%d\n",sizeof(arr));
//7 //整个数组内存大小
printf("%d\n",sizeof(arr+0));
//4或8 //首元素地址内存大小
printf("%d\n",sizeof(*arr));
//1 //*arr==arr[0] 第一个元素内存大小
printf("%d\n",sizeof(arr[1]));
//1 //第二个元素内存大小
printf("%d\n",sizeof(&arr));
//4或8 //整个数组地址内存大小
printf("%d\n",sizeof(&arr+1));
//4或8 //跳过整个数组的地址内存大小
printf("%d\n",sizeof(&arr[0]+1));
//4或8 //跳过第一个数组的地址内存大小==第二个数组地址内存大小
return 0;
}
int main()
{
char* p = "abcdef";//p存放a的地址,指向a
printf("%d\n",sizeof(p));
//4 或 8//a的地址内存大小
printf("%d\n",sizeof(p+1));
//4 或 8//跳过a的地址内存大小==b的地址内存大小
printf("%d\n",sizeof(*p));
//1 //*p==a 计算a的内存大小
printf("%d\n",sizeof(p[0]));
//1 //a的内存大小
printf("%d\n",sizeof(&p));
//4 或 8//p的地址内存大小
printf("%d\n",sizeof(&p+1));
//4 或 8//跳过p后的地址内存大小
printf("%d\n",sizeof(&p[0]+1));
//4 或 8//跳过a后的地址内存大小
return 0;
}
3.二维数组
int main()
{
int a[3][4] = { 0 };
printf("%d\n",sizeof(a));
//48 //整个数组内存大小3*4*4=48
printf("%d\n",sizeof(a[0][0]));
//4 //第一个元素内存大小
printf("%d\n",sizeof(a[0]));
//16 //第一行数组内存大小 4*4=16
//a[0]是第一行数组名
printf("%d\n",sizeof(a[0]+0));
//4或8 //第一行第一个a[0][0]的地址内存大小
//a[0]是第一行数组名,没有单独放在sizeof内部
//所以该数组名表示数组首元素的地址
printf("%d\n",sizeof(*(a[0]+1)));
//4 //第一行第二个元素的内存大小
printf("%d\n",sizeof(a+1));
//4或8 //跳过第一行元素的地址内存大小==第二行元素地址内存大小
printf("%d\n",sizeof(*(a+1)));
//16 //跳过第一行的内存大小==第二行内存大小4*4
printf("%d\n",sizeof(&a[0]+1));
//4或8 //跳过第一行元素的地址内存大小==第二行元素地址内存大小
//a[0]是第一行数组名,&a[0]是第一行地址,&a[0]+1是第二行地址
printf("%d\n",sizeof(*(&a[0]+1)));
//16 //跳过第一行的元素内存大小==第二行元素内存大小
printf("%d\n", sizeof(*a));
//16//第一行元素内存大小
//a是数组首元素的地址,也就是第一行地址
printf("%d\n", sizeof(a[3]));
//16//第四行元素内存大小
return 0;
}
❗易模糊点: