数组名大小的计算详解
int main()
{
//数组名是首元素地址
// 1,sizeof(数组名)——数组名表示整个数组
// 2,&数组名——表示整个数组
// 除这两种情况外,都是首元素地址
//
int a[] = { 1,2,3,4 };
printf("%d\n", sizeof(a));//szieof(数组名),计算的是数组的总大小—单位字节—16
printf("%d\n", sizeof(a + 0));//a+0 为首元素地址 地址大小,32位 4个字节 64位 8个字节
printf("%d\n", sizeof(*a));//*a 首元素地址解引用 大小是4
printf("%d\n", sizeof(a + 1));//4/8 a+1 第二个元素地址
printf("%d\n", sizeof(a[1]));//第二个元素的大小 4
printf("%d\n", sizeof(&a));//&a 取出的是数组的地址 地址的大小 4/8
printf("%d\n", sizeof(*&a));//&a再解引用,还是a 整个数组的大小 16
printf("%d\n", sizeof(&a+1));//&a+1跳过了一个数组,指向还是一个地址,地址大小 4/8
printf("%d\n", sizeof(&a[0]));//&a[0]取出第一个元素的地址 地址大小 4/8
printf("%d\n", sizeof(&a[0]+1));//&a[0]+1第二个元素地址的大小 4/8
return 0;
}
int main()
{
char arr[] = { 'a','b','c','d','e','f' };
printf("%d\n", sizeof(arr));//6 szieof(数组名),计算的是数组的总大小—单位字节
printf("%d\n", sizeof(arr + 0));//arr+0 为首元素地址 地址大小,32位 4个字节 64位 8个字节
printf("%d\n", sizeof(*arr));//*arr 首元素地址解引用 大小char类型 1
printf("%d\n", sizeof(arr[1]));//arr[1]第二个元素大小 1
printf("%d\n", sizeof(&arr));//&arr 取出的数组地址 地址大小 4/8
printf("%d\n", sizeof(&arr+1));//&arr+1 跳过一个数组 指向还是地址 地址大小 4/8
printf("%d\n", sizeof(&arr[0]+1));//&arr[0]+1 第二个元素地址 地址大小 4/8
printf("%d\n", strlen(arr));//随机值 strlen 遇到\0停止,此数组没有\0
printf("%d\n", strlen(arr+0));//arr+0 还是arr 随机值
//printf("%d\n", strlen(*arr));//err ‘a’不是地址 错误
//printf("%d\n", strlen(arr[1]));//err
//printf("%d\n", strlen(&arr));//随机值 数组指针 char(*)[7] = &arr 与strlen的参数const char* 不兼容
//printf("%d\n", strlen(&arr + 1));//随机值-6 数组指针 char(*)[7] = &arr 与strlen的参数const char* 不兼容
printf("%d\n", strlen(&arr[0] + 1));//从第二个元素开始计算长度 随机值-1
char arr[] = "abcdef";
printf("%d\n", sizeof(arr)); //“abcdef”里默认有个‘\0’,szieof(数组名),计算的是数组的总大小—单位字节 6
printf("%d\n", sizeof(arr + 0));//arr+0 首元素地址 地址大小 4/8
printf("%d\n", sizeof(*arr));//*arr 首元素地址解引用 char类型大小 1个字节
printf("%d\n", sizeof(arr[1]));//第二个元素大小 1个字节
printf("%d\n", sizeof(&arr));//取出数组的地址 地址的大小 4/8
printf("%d\n", sizeof(&arr + 1));//&arr+1 跳过一个数组 指向还是地址 地址大小 4/8
printf("%d\n", sizeof(&arr[0] + 1));//得到第二个元素的地址 地址大小 4/8
printf("%d\n", strlen(arr));//“abcdef”里默认有个‘\0’,strlen 遇到‘\0’停止计算 6
printf("%d\n", strlen(arr + 0));//首元素地址 计算同上 6
//printf("%d\n", strlen(*arr));//err 非法访问 *arr 不是地址
//printf("%d\n", strlen(arr[1]));//err 非法访问 *arr 不是地址
//printf("%d\n", strlen(&arr));//数组指针 char(*)[7] = &arr 与strlen的参数const char* 不兼容 7
//printf("%d\n", strlen(&arr + 1));//随机值-6 数组指针 char(*)[7] = &arr 与strlen的参数const char* 不兼容
printf("%d\n", strlen(&arr[0] + 1));// 从第二个元素开始计算长度 6 - 1 = 5
const char* p = "abcdef";//把常量字符串中a的地址放入p里面
printf("%d\n", sizeof(p));//计算指针变量p的大小 指针大小 4/8
printf("%d\n", sizeof(p+1)); //计算指针p+1 第二个元素地址的大小 4/8
printf("%d\n", sizeof(*p));//*p 第一个字符 大小 1
printf("%d\n", sizeof(p[0]));//p[0] 第一个字符 大小 1
printf("%d\n", sizeof(&p));//&p 也是地址 地址大小 4/8
printf("%d\n", sizeof(&p + 1));//&p+1 +1加的是整个字符串的大小 得到还是一个地址 地址大小 4/8
printf("%d\n", sizeof(&p[0] + 1));//得到第二个元素的地址 地址大小 4/8
printf("%d\n", strlen(p)); //首元素地址 a开始计算 “abcdef”里默认有个‘\0’,strlen 遇到‘\0’停止计算 6
printf("%d\n", strlen(p+1));//p+1 第二个元素开始计算 5
//printf("%d\n", strlen(*p));//err
//printf("%d\n", strlen(p[0]));//err
//printf("%d\n", strlen(&p)); //随机值 数组指针 char(* )[7] = &arr 与strlen的参数const char* 不兼容
//&p是指针p的地址 从p地址开始计数
//printf("%d\n", strlen(&p+1));随机值 数组指针 char(*)[7] = &arr 与strlen的参数const char* 不兼容
//&p是指针p的地址 从p+1地址开始计数
printf("%d\n", strlen(&p[0]+1));//得到第二个元素地址 从第二个元素开始计算
int a[3][4] = { 0 };
printf("%d\n", sizeof(a));//48 整个数组的大小
printf("%d\n", sizeof(a[0][0]));//首元素的大小 4
printf("%d\n", sizeof(a[0]));//16 a[0] 第一行的一维数组的数组名 计算整个数组大小
printf("%d\n", sizeof(a[0]+1));//a[0]+1 得到a[0][1]的地址,第一行第二个元素地址 地址大小 4/8
printf("%d\n", sizeof(*(a[0]+1)));//第一行第二个元素地址解引用 第一行第二个元素大小 int类型 4
printf("%d\n", sizeof(a+1)); //把二维数组看成一维 a+1是第二行的一维数组的地址 地址大小 4/8
printf("%d\n", sizeof(*(a + 1)));//第二行一维数组的地址解引用 相当于放入第二行的数组名 16
printf("%d\n", sizeof(&a[0]+1));//&a[0]是第一行一维数组的地址 +1 是第二行一维数组的的地址 地址大小 4/8
printf("%d\n", sizeof(*(&a[0] + 1)));//第二行一维数组的地址解引用 相当于放入第二行的数组名 16
printf("%d\n", sizeof(*a));//16 第一行一维数组的地址解引用 相当于放入第一行一维数组的数组名
printf("%d\n", sizeof(a[3]));//sizeof 不是直接访问,不参与数组的内部真实运算 根据数组的类型进行计算
//此处是第四行一维数组的大小 16
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下