有人可以解释一下代码吗?

时间:2016-11-28 18:48:17

标签: c pointers

我必须仅使用指向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;
}

3 个答案:

答案 0 :(得分:1)

由于这些陈述

p = (char*)&i;   
q = (char*)&j;

对象ij被认为(解释)为具有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。