这段 c++代码啥意思? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
soratadori
V2EX    C++

这段 c++代码啥意思?

  •  
  •   soratadori 2017-04-11 05:45:58 +08:00 4235 次点击
    这是一个创建于 3167 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我不会 c++,抄一段程序抄到最后发现看不懂了。

    Buffer 是一段 bytes ,由 fread 读取文件的某部分获得

     for(unsigned int i=0; 10; i++){ unsigned char sample[4]; *(unsigned int*)sample = *((unsigned int*)Buffer+i); sample[1] sample[2] balabala } 

    等号右边是怎么变成数组的..

    第 1 条附言    2017-04-11 15:15:21 +08:00
    死循环?是因为 (unsigned int i=0; 10; i++) 吗?
    原来写的是 unsigned init i=0; i<10; i++ 哈哈哈...
    第 2 条附言    2017-04-11 17:09:43 +08:00
    已经搞定了,谢谢各位,尤其是谢谢一楼
    21 条回复    2017-04-14 02:38:32 +08:00
    Valyrian
        1
    Valyrian  
       2017-04-11 05:51:39 +08:00
    每次把 4 byte 的的内容从 buffer 复制到 sample
    soratadori
        2
    soratadori  
    OP
       2017-04-11 06:04:24 +08:00
    @Valyrian
    thanks
    wolegequ
        3
    wolegequ  
       2017-04-11 06:12:39 +08:00 via Android
    都不睡的吗
    lany
        4
    lany  
       2017-04-11 07:56:46 +08:00
    先是把 buffer 转成 unsigned int 型的指针,指针+1 就是指针+1 个 int ;于是循环 10 次不停+1 ,变成了改数组下标一样了。
    abscon
        5
    abscon  
       2017-04-11 08:13:04 +08:00 via iPhone
    @lany 你确定是循环十次?
    lany
        6
    lany  
       2017-04-11 08:14:13 +08:00
    @abscon for 里面不是写了 10 么?难道我错了?我有点凌乱。。。
    hanxiV2EX
        7
    hanxiV2EX  
       2017-04-11 08:26:11 +08:00 via iPhone
    读取 10 个整数
    zwzmzd
        8
    zwzmzd  
       2017-04-11 08:31:25 +08:00 via iPhone
    看样子是分离 unsigned int 的每一位,一共处理了 10 个 unsigned int
    araraloren
        9
    araraloren  
       2017-04-11 08:37:52 +08:00
    @lany 是写了个 10 。。
    估计是写错了。。
    sundev
        10
    sundev  
       2017-04-11 08:43:35 +08:00
    4 个无符号 char 强制转换为 无符号 int
    里面的代码好理解, for 循环条件写错了?还是我孤陋寡闻!
    zh5e
        11
    zh5e  
       2017-04-11 09:02:06 +08:00
    死循环了
    wizardoz
        12
    wizardoz  
       2017-04-11 09:13:36 +08:00
    请问 blablabla 的地方干了什么?
    如果没有合理的理由我觉得这个代码写的不太好,如果想转字节序我会选择用 hton 和 ntoh 函数,毕竟直观的多。
    aleen42
        13
    aleen42  
       2017-04-11 09:13:40 +08:00
    2333 循环给弄死了
    wizardoz
        14
    wizardoz  
       2017-04-11 09:16:52 +08:00
    @wizardoz 如果是教材上的例子就可以理解,目的是为了说明指针的用法。指针是内存地址,同一个内存区域,访问出的数据是什么格式取决于你用那种类型的指针去访问他。
    stormpeach
        15
    stormpeach  
       2017-04-11 09:27:06 +08:00
    死循环了,抄错了?
    lrh3321
        16
    lrh3321  
       2017-04-11 09:28:55 +08:00
    死循环了 +1
    psklf
        17
    psklf  
       2017-04-11 10:14:09 +08:00
    循环写清楚 blabla 建议也写一下 好弄明白到底在干啥
    tyzual
        18
    tyzual  
       2017-04-11 16:22:40 +08:00
    *(unsigned int*)sample = *((unsigned int*)Buffer+i);

    楼主主要是看不懂这句话吧。
    按照楼主的说明 Buffer 应该是一个类似于
    byte *Buffer 或者 byte Buffer[随便一个什么数字] 的东西。
    等号右边先把 Buffer(强行)转成一个 unsigned int *这样的话,后面 + i 就会按照无符号整型来计算偏移量,也就是+i 会向后移动 i * sizeof(unsigned int) 个地址。(否则会向后移动 i * sizeof(byte))。
    计算完成偏移量以后,再对这个地址解引用(取值),因为这个时候,地址的类型是 unsigned int *所以此时编译器会把当前地址储存的数据当成一个无符号整形来对待, unsigned int 站四个 byte ,所以编译器会从计算完成的偏移量开始向后读取四个 byte 的内容作为要赋的值。即等号右边的值。

    等号左边先把 sample 强行转成了一个 unsigned int *然后在解引用(取值)。因此,解引用完成的时候,等号左边的类型是一个 unsigned int (虽然实际上不是)。因此编译器会把等号右边的值写入到 sample 起始地址到 sample 地址后四个 byte 中。
    而 sample 的实际类型是 byte[4],长度正好也是四个 byte 。所以 sample[0] 的值正好就是赋值号右边那个值的最低位 byte 的值, sample[1]是第二低位 byte 的值。以此类推。
    soratadori
        19
    soratadori  
    OP
       2017-04-11 17:10:48 +08:00
    @lany
    @zwzmzd
    @wizardoz
    @tyzual

    谢谢,已经搞定了
    googlebot
        20
    googlebot  
       2017-04-11 17:15:50 +08:00 via iPad
    Lz 没学过 c ? 这是指针基本用法,
    mb4555
        21
    mb4555  
       2017-04-14 02:38:32 +08:00 via Android
    类型转换加解引用
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5106 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 31ms UTC 07:58 PVG 15:58 LAX 23:58 JFK 02:58
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86