首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

一个关于指针及地址的有关问题,求大神帮忙.

2013-09-28 
一个关于指针及地址的问题,求大神帮忙....#include stdio.hint main(){unsigned int a0x12345678char

一个关于指针及地址的问题,求大神帮忙....
#include "stdio.h"
int main()
{
    unsigned int a=0x12345678;
    char *c=(char*)&a;
    printf("%x %x %x\n",*c,*(c+1),*(c+1)+1); 
    return 0;
}

//结果是78,56,57
怎么得出78,56的这个我知道,但是*(c+1)+1怎么得出57的?
我的理解是这样的:*(c+1)指向存储56这个字节的首地址,然后*(c+1)+1指针加1后就指向下一个字节到78那里了,那按理说输出的应该是78呀,怎么是57呢?难道*(c+1)+1同时指向了5和7?愿诸位大神能给出详细说明下... 指针
[解决办法]
(*(c+1) ) + 1 

*(c+1) == 56 
56 + 1 == 57
[解决办法]


// a 的四个字节简单模拟存储内存图

[解决办法]
12

[解决办法]
34

[解决办法]
56

[解决办法]
78
//入栈的顺序,取值是先进后出,所以*c先是78
// (c+1) 就就指向了56 ,
//57这个值,楼主不要困在题里面了 , *(c+1) +1, 取(c+1)地址上的内容再加1而已!

[解决办法]
*(c+1)+1;//c+1所指向的内容+1,不是地址加1

[解决办法]

printf("%x %x %x\n",*c,*(c+1),*(c+1)+1); 
//*c      78
//*(c + 1)      56
//*(c + 1) + 1      56+1 ==57

[解决办法]
*解析运算符比算术运算符+优先级高,这也是为什么*(c+1)要加括号,才能使得指针偏移下一字节,否则就是对指针指向的内存中的值做算术运算。即*(c+1)+1=56+1=57因此不等价于*((c+1)+1)=34
[解决办法]
楼主,在你的代码中插入了几行,可以更清楚的看下变量a在内存的分布,也有助于理解你的程序为什么会这样输出。代码如下:

 unsigned int a=0x12345678;
 char *c=(char*)&a;
 //插入的代码
 printf("c  所指的地址是%p,对应的字节内容是%x\n",c,*c);
 printf("c+1所指的地址是%p,对应的字节内容是%x\n",c+1,*(c+1));
 printf("c+2所指的地址是%p,对应的字节内容是%x\n",c+2,*(c+2));
 printf("c+3所指的地址是%p,对应的字节内容是%x\n",c+3,*(c+3));
 
 printf("%x %x %x\n",*c,*(c+1),*(c+1)+1); 

输出如下:
c  所指的地址是0028FAD0,对应的字节内容是78
c+1所指的地址是0028FAD1,对应的字节内容是56
c+2所指的地址是0028FAD2,对应的字节内容是34
c+3所指的地址是0028FAD3,对应的字节内容是12
78 56 57
请按任意键继续. . .

可以看到c+1对应的内容是56,所以*(c+1)+1 = 57.

这个题目也用到了大小端的知识,与昨天笔试时碰到的题目很像啊。
以前大小端的问题也看到好几次了,但是还是没弄太明白,昨天又碰到了,虽然答对了,但回去后再次复习了下。总算明白了这个顺序说滴是字节之间的顺序,而不是字节内的顺序。在这里稍微提下。
下面这篇博客讲的不错。
http://blog.csdn.net/yasaken/article/details/7243757
其中的栗子举的很好
从内存地址0x0000开始有以下数据
        0x0000    0x12
        0x0001    0x34
        0x0002    0xab
        0x0003    0xcd
    
如果我们去读取一个地址为0x0000的四个字节变量:
       若字节序为big-endian,则读出结果为0x1234abcd;
       若字节序位little-endian,则读出结果为0xcdab3412.
有读就有写,如果我们将0x1234abcd写入到以0x0000开始的内存中,则结果为:
                        big-endian      little-endian
        0x0000          0x12                  0xcd
        0x0001          0x23                  0xab
        0x0002          0xab                  0x34
        0x0003          0xcd                  0x12

Intelx86系列以及ARM系列CPU都是little-endian的字节序,我电脑的CPU是AMD的,看来也是little-endian了。

热点排行