2017-06-20 103 views
-6

我的代码是在这里指针输出困惑我

int main()  
{  
    int a=300;  
    char *p=(char *)&a;   
    printf("%d\n",*p);  
    printf("%d",*++p);  
} 

输出

任何机构可以解释它。

+0

用二进制写'300',按字节分割字节 –

+1

您的代码被C和C++编译器拒绝。发布有效的代码。并且不要垃圾邮件标签。 – StoryTeller

+5

'300' --->'0x12C' ....和little endian ... – LPs

回答

1

由于我们知道int数据类型的大小取决于您的系统,因此它可以是2 bytes4 bytes。同时指针指向一次一个字节。的int a = 300;

ptr

记忆表示所以,char指针p指向仅第一字节作为显示上图中。

所以,第一次打印输出。

然后,

printf("%d",*++p); 

第一p是增量和指针指向下一个(第二)字节。所以,下一个字节输出是1

+2

好的例证。你是如何添加它的? – CIsForCookies

+2

最好只说至少2个字节。 “int”可以是实现者想要的任何东西。 4和8今天很常见,但谁可以说明天会带来什么。 – user4581301

0

a太大了一个字节来表示,因为它的二进制表示是但至少0000000100101100取决于int类型多少字节得到。在这种表示它得到2个字节,它可以有4个或8个,或其他尺寸,依赖于平台的)。

当你做char *p=(char *)&a;你只看上a一个字节 - 00000001---00101100 - 右边部分,它的价值是44

当移动到下一个字节位置(++p),字节存在左侧部分(00000001)和它的值是1

0

你得到这些值的原因是因为你(如果你知道your're做什么,这当然是好)治疗的int内存位置的两个char存储位置。您的原始int a在内存(字节视图)表示,像这样:

[0x2c=44] [0x01=1]这使得0x12c结合时是300

以下修改您的密码有助于更好地理解这个

#include <stdio.h> 

int main(int argc, char** argv) 
{ 
    int i; 
    int a=300; 
    char *p=(char*)&a; 
    for (i=0;i<sizeof(a);i++) 
    { 
     printf("[0x%02x] ", p[i]); 
    } 
    printf("\n"); 
}