数组名大小计算全解

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(数组名),计算的是数组的总大小—单位字节 7
    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* 不兼容 6
    //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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值