我正在学习更多关于c语言的知识,我对我见过的1个代码有1个疑问。
main(){
int i = (65*256+66)*256+67;
int* pi;
char* pc;
pi = &i;
pc = (char*)pi;
printf("%c %c %c \n", *pc, *(pc+1), *(pc+2));
}
输出为:C B A
我知道A的ASCII码是65,B是66,C是67,但变量i不是它们。 如果我把变量i = 65,输出只是A而不显示B或C,为什么?
我想知道为什么这段代码有输出。谢谢你的帮助。
答案 0 :(得分:0)
* 256表示左移8位(1字节),因此行
int i =(65 * 256 + 66)* 256 + 67;
实际上将A,B,C放在内存中的3个相邻字节上
然后pi指针指向整数i的地址,然后将同一地址向下转换为char指针pc,因此pc实际上将地址保存到包含'A'的字节,当然如果你将1和2添加到地址表示相邻的'B'和'C'指向并打印出来。
编辑:只是为了澄清更多的int是32位长但char是8位,这就是为什么你需要一个char指针来表示一个有效8位长的地址。
答案 1 :(得分:0)
您可能知道,字符存储为字节。变量'i'的初始化具有以下含义:
65*256 // store 65 ('A') and left shift it by 8 byte (= '*256')
(65*256+66)*256 // add 66 ('B') and shift the whole thing again
(65*256+66)*256+67 // add 67 ('C')
'pi'被初始化为指向'i'的INT指针 'pc'被初始化为'pi'的CHAR指针 所以'pc'然后保存存储在'i'中的3个字节的开头的地址,其中包含'A' 通过向pc中的地址添加1和2,可以获得第二个和第三个字节(包含“B”和“C”),如下所示:
printf("%c %c %c \n", *pc, *(pc+1), *(pc+2));
处理这里的位; D
答案 2 :(得分:0)
该行
int i = (65*256+66)*256+67;
将我变成以下
00000000 01000001 01000010 01000011
int = 4个字节或4个8位组
char = 1个字节或1个8位组。
使用char指针指向原始int位的子集。
首先,指针指向8个最低有效位(右侧组)。 并打印字母C.然后,它自己的指针递增1,这使得它指向存储器中恰好为B的下一组8位。再次指向A。