sizeof学习

sizeof学习

0. 前言

  • 跑去面试做了下题
  • 有个sizof()各种数组的题,而我之前总是数组和指针傻傻分不清
  • 过去不怎么用到sizeof(),用到也是直接测试运行没啥问题就不在意了
  • 但是确实是没弄清楚,所以仔细学一下

1. 参考

2. 指针和数组的不同

  • 指针和数组,是两个东西,虽然很像,但是确实是两个东西

  • 测试

    数组本身不能被改变,数组内的元素可以被改变

    指针可以指向数组,然后使用类似数组的操作

  • 代码测试

    64位的系统,指针是64位的

    int main()
    {
    
    
        char a[] = "123456";
        char *b;
        b = a;
        // a++;
        b++;
        printf("sizeof a : %d\n", sizeof(a));
        printf("sizeof b : %d\n", sizeof(b));
        printf(b);
    }
    
    sizeof a : 7
    sizeof b : 8
    23456
    
  • 如果直接将数组自加一,编译器会报错

    int main()
    {
    
    
        char a[] = "123456";
        char *b;
        b = a;
        a++;
        b++;
        printf("sizeof a : %d\n", sizeof(a));
        printf("sizeof b : %d\n", sizeof(b));
        printf(b);
    }
    
    PS E:\selfStudy\C_study\2_code\test_sizeof> cd "e:\selfStudy\C_study\2_code\test_sizeof\" ; if ($?) { gcc test.c -o test } ; 
    if ($?) { .\test }
    test.c: In function 'main':
    test.c:10:6: error: lvalue required as increment operand
         a++;
          ^~
    
  • 数组加一就变成了指针了,而指针在sizeof()里面自加一,指针的值不会变

代码:

int main()
{


    char a[] = "123456";
    char *b;
    b = a+1;
    // a++;
    b++;
    printf("sizeof a : %d\n", sizeof(a));
    printf("sizeof a+1 : %d\n", sizeof(a+1));
    printf("b int: %d\n", (unsigned int)b);
    printf("sizeof b : %d\n", sizeof(b++));
    printf("b int: %d\n", (unsigned int)b);
    // b++;
    printf(b);
}

运行结果

test.c: In function 'main':
test.c:14:27: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
     printf("b int: %d\n", (unsigned int)b);
                           ^
test.c:16:27: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
     printf("b int: %d\n", (unsigned int)b);
                           ^
sizeof a : 7
sizeof a+1 : 8
b int: 6422035
sizeof b : 8
b int: 6422035
3456
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值