【c语言】数组计算问题--数组的大小是多少

解释说明:每一条语句后面的就是测出来的运行结果,下面是原因解释:

#include <stdio.h> 
int main()
{
    int a[] = { 1, 2, 3, 4 };
    printf("%d\n", sizeof(a));//16
    //数组名放在sizeof里表示整个数组
    printf("%d\n", sizeof(a + 0));//4
    //首元素a[0]地址
    printf("%d\n", sizeof(*a));//4
    //首元素大小
    printf("%d\n", sizeof(a + 1));//4
    //第二个元素a[1]地址
    printf("%d\n", sizeof(a[1]));//4
    //a[1]元素大小
    printf("%d\n", sizeof(&a));//4
    //首元素地址的地址
    printf("%d\n", sizeof(&a + 1));//4
    //首元素地址的地址加1,跳过整个数组
    printf("%d\n", sizeof(&a[0]));//4
    //首元素地址
    printf("%d\n", sizeof(&a[0] + 1));//4
    //第二个元素地址

    char arr[] = { 'a', 'b', 'c', 'd', 'e', 'f' };
    printf("%d\n", sizeof(arr));//6
    //数组名表示整个数组
    printf("%d\n", sizeof(arr + 0));//4
    //首元素地址
    printf("%d\n", sizeof(*arr));//1
    //第一个元素
    printf("%d\n", sizeof(arr[1]));//1
    //第二个元素
    printf("%d\n", sizeof(&arr));//4
    //首元素地址的地址+1
    printf("%d\n", sizeof(&arr + 1));//4
    //首元素地址的地址+1,跳过整个数组
    printf("%d\n", sizeof(&arr[0] + 1));//4
    //第二个元素地址
//
    printf("%d\n", strlen(arr));//19
    //没有结尾的‘\0’,随机产生
    //printf("%d\n", strlen(arr + 0));//19
    //没有结尾的‘\0’,随机产生
//  printf("%d\n", strlen(*arr));//无法输出
//访问首元素地址的地址,传参错误,应该为char*实际为char,不是地址,发生访问冲突
//  printf("%d\n", strlen(arr[1]));//无输出
//访问第二个元素,,参数类型错误,应该位char*实际为char,不是地址,出现访问冲突
    printf("%d\n", strlen(&arr));//19
    //没有结尾的‘\0’,随机产生,访问首元素地址的地址
    printf("%d\n", strlen(&arr + 1));//13
    //没有结尾的‘\0’,随机产生,访问首元素地址的地址加1跳过整个数组

    printf("%d\n", strlen(&arr[0] + 1));//18
    //没有结尾的‘\0’,随机产生,访问第二个元素地址

    char *p = "abcdef";//后面有一个隐藏的‘\0’
    printf("%d\n", sizeof(p));//4
    //计算首元素地址的大小
    printf("%d\n", sizeof(p + 1));//4
    //计算第二个元素地址的大小
    printf("%d\n", sizeof(*p));//1
    //计算首元素大小
    printf("%d\n", sizeof(p[0]));//1
    //计算首元素大小
    printf("%d\n", sizeof(&p));//4
    //计算首元素地址的地址大小
    printf("%d\n", sizeof(&p + 1));//4
    //计算首元素地址的地址+1的大小(跳过整个数组)
    printf("%d\n", sizeof(&p[0] + 1));//4
    //计算第二个元素地址大小

    printf("%d\n", strlen(p));//6
    //表示字符串长度(到‘\0’结束)
    printf("%d\n", strlen(p + 1));//5
    //从第二个元素开始求字符串长度
//  printf("%d\n", strlen(*p));//...
//需要参数是char*实际为char,不是地址,访问冲突
//  printf("%d\n", strlen(p[0]));//...
//同上
    printf("%d\n", strlen(&p));//随机数
    //从首元素地址的地址开始计算字符串长度,是一个随机值,
    printf("%d\n", strlen(&p + 1));//随机数
    从首元素地址的地址下一位(跳过整个数组)开始计算字符长度,是一个随机值
    printf("%d\n", strlen(&p[0] + 1));//5
    //从第二个元素开始计算整个字符串的长度

    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));//4
    //计算a[0][1]的地址的大小
    printf("%d\n", sizeof(a + 1));//4
    //计算第二行首元素地址大小
    printf("%d\n", sizeof(&a[0] + 1));//4
    //同上
    printf("%d\n", sizeof(*a));//16
    //计算第一行的大小
    printf("%d\n", sizeof(a[3]));//16
    //计算数组后面空间的大小(整个数组之后)
    return 0;
}
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值