我必须仅使用指向char的指针来赋值变量“i”的变量“j”。我无法编写代码,所以我看到了这个解决方案,但我不明白“for”机构中发生了什么。有人可以向我解释一下吗?
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main(int argc, char **argv) {
int i = 10;
int j = 20;
char *p, *q;
p = (char*)&i;
q = (char*)&j;
for(int k = 0; k < sizeof(i); ++k) {
*(q + k) = *(p + k);
}
printf("%d == %d\n", i, j);
return 0;
}
答案 0 :(得分:1)
由于这些陈述
p = (char*)&i;
q = (char*)&j;
对象i
和j
被认为(解释)为具有sizeof( int )
个字符的字符数组。在这个循环中
for(int k = 0; k < sizeof(i); ++k) {
*(q + k) = *(p + k);
}
这些字符从整数变量i
逐字节复制到整数变量j
。
对于这些表达式*(q + k)
和*(p + k)
,它们完全等同于q[k]
和p[k]
。因此,可以使用此语法重写循环
for(int k = 0; k < sizeof(i); ++k) {
q[k] = p[k];
}
答案 1 :(得分:0)
p = (char*)&i;
q = (char*)&j;
现在p和q指向i和j的最低字节,因为char指针只能指向一个字节。在for循环中,指针的增量使指针指向下一个字节,同时将字节复制到q指向的内存中。
答案 2 :(得分:0)
代码正是您所寻找的,将j的值复制到变量i。但它是逐字节的。
p = (char*)&i;
q = (char*)&j;
这将p和q的值初始化为分别指向i和j的第一个字节的指针。
sizeof(i);
以字节数(在本例中为4)返回变量j的大小。
然后在for循环中:
for(int k = 0; k < sizeof(i); ++k) {
*(q + k) = *(p + k);
}
我们去
*(q + k)
这指向[(j的起始地址)+ k]字节的存储器地址。 同样适用于变量i - &gt;
*(p+k)
因此,第(p + k)个存储单元的每个值都被复制到第(q + k)个地址指向的地址。
因此我们有j == i。