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