关于指针和ASCII代码

时间:2014-03-08 19:19:47

标签: pointers ascii

我正在学习更多关于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,为什么?

我想知道为什么这段代码有输出。谢谢你的帮助。

3 个答案:

答案 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。