这段 c++代码啥意思?

2017-04-11 05:45:58 +08:00
 soratadori

我不会 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
}

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

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

谢谢,已经搞定了
googlebot
2017-04-11 17:15:50 +08:00
Lz 没学过 c ? 这是指针基本用法,

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/353968

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX