2 zql229295479 zql229295479 于 2015.07.24 16:02 提问

c语言指针指向地址的问题 求大神详细解答

#include
int main(int argc, char const *argv[])
{

int  b=0x12345678;

char *p4=(char *)&b;
printf("p=0x%hhx\n",*p4 );
printf("p=0x%hhx\n",*(p4+1) );

char *p7="helloworld";

printf("%c\n",*p7 );
return 0;

}

为什么*p4打印的结果是ox78,而*p7的结果是'h'而不是'd'?

5个回答

zql229295479
zql229295479   2015.07.24 15:58

求大神给一下详细的解答和原理

weixin_29257017
weixin_29257017 *p 7指向的是你字符串的首地址也就是h的地址,所以你打印字符时显示的是h,若把%c改为%s则打印的是整个字符串。记住不管任何内类型的数据,都采用的是首地址存储的地址
2 年多之前 回复
ytuglt
ytuglt   2015.07.24 16:20

这个地方涉及到处理器大小端的问题,一般电脑都是小端的,也就是说高位保存到内存高地址,低位保存到低地址,此处*p4强制转换为char型,所以只取低字节,因为b在内存中保存方式自高字节到低字节依次保存到内存的高地址到低地址,所以此处的*(p4+1)则是56,依次类推*(p4+2)为34,*(p4+3)为12,
*p7此处定义的字符串,则p7代表该字符串的首地址,此处只打印一个字节,所以打印的是字符串的首字母

ytuglt
ytuglt 回复zql229295479: 该处理器是小端模式,字节序是高位保存到高地址,字符串其实就是字符char数组,就一个字节,不用考虑大小端,注意区分int类型多字节,和字符串是一个字节数组就好
2 年多之前 回复
zql229295479
zql229295479 也就是说,该处理器是小端模式,先保存高位地址然后再是地位,但是打印输出的时候就要从低到高输出?
2 年多之前 回复
VisualEleven
VisualEleven   Ds   Rxr 2015.07.25 09:21

你Debug下看到memory看一下内存布局,看看你的int b的数据是怎么存放的。

K346K346
K346K346   2015.07.25 10:44

你要记住两点,弄清楚一点。记住两点,第一点是字符串采用大端模式存储,第二点是指针始终指向变量的低地址,不是最地位。弄清楚一点是什么是大端存储,什么是小端存储。计算机一般采用小端模式存储非字符串变量。

u014306011
u014306011   2015.07.28 22:08

我也认为是机器的大端小端问题。

Csdn user default icon
上传中...
上传图片
插入图片