在以下程序中,假设a存储在地址1000处,并且int占用4字节的存储空间。现在,c将指向基地址,即1000并将其递增3将使其指向地址1003.现在,打印c指向的字符必须给我对应于ascii 65的字符。但它什么都不打印! / p>
#include<stdio.h>
#include<stdlib.h>
int main(){
int a = 65;
char *c = &a;
printf("%c\n", *(c+3));
}
我的推理有什么问题?
答案 0 :(得分:7)
您没有考虑到字节序。在小端系统上,'a'
(或编码不兼容ASCII,无论65
是什么)将在第一个字节中,其他字节为0.传递0字节到printf("%c\n",_);
只打印换行符。
答案 1 :(得分:3)
打印c指向的字符必须给我对应ascii 65
的字符
它应该,如果你的机器是小端的,它确实会。但是,您使用int
打印*(c + 3)
的第4个字节,仍为0.或许您的意思是*c
?
然而,最好的不是通过指针来混叠。整数具有很好的属性,可以通过按位运算符对它们进行操作。
uint32_t i = 0x12345678;
uint8_t b0 = (i >> 0) & 0xff;
uint8_t b1 = (i >> 8) & 0xff;
uint8_t b2 = (i >> 16) & 0xff;
uint8_t b3 = (i >> 24) & 0xff;
这样,无论酸结构的字节顺序如何,都可以正确访问字节。