我的代码是在这里指针输出困惑我
int main()
{
int a=300;
char *p=(char *)&a;
printf("%d\n",*p);
printf("%d",*++p);
}
输出
任何机构可以解释它。
我的代码是在这里指针输出困惑我
int main()
{
int a=300;
char *p=(char *)&a;
printf("%d\n",*p);
printf("%d",*++p);
}
输出
任何机构可以解释它。
由于我们知道int数据类型的大小取决于您的系统,因此它可以是2 bytes
或4 bytes
。同时指针指向一次一个字节。的int a = 300;
记忆表示所以,char
指针p
指向仅第一字节作为显示上图中。
所以,第一次打印输出。
然后,
printf("%d",*++p);
第一p
是增量和指针指向下一个(第二)字节。所以,下一个字节输出是1
。
好的例证。你是如何添加它的? – CIsForCookies
最好只说至少2个字节。 “int”可以是实现者想要的任何东西。 4和8今天很常见,但谁可以说明天会带来什么。 – user4581301
a
太大了一个字节来表示,因为它的二进制表示是但至少0000000100101100
(取决于int
类型多少字节得到。在这种表示它得到2个字节,它可以有4个或8个,或其他尺寸,依赖于平台的)。
当你做char *p=(char *)&a;
你只看上a
一个字节 - 00000001---00101100
- 右边部分,它的价值是44
当移动到下一个字节位置(++p
),字节存在左侧部分(00000001
)和它的值是1
你得到这些值的原因是因为你(如果你知道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");
}
用二进制写'300',按字节分割字节 –
您的代码被C和C++编译器拒绝。发布有效的代码。并且不要垃圾邮件标签。 – StoryTeller
'300' --->'0x12C' ....和little endian ... – LPs