为什么在C中使用字符指针访问整数变量会导致只截断一个字节?

为什么在C中使用字符指针访问整数变量会导致只截断一个字节?,c,pointers,C,Pointers,对于以下一段C代码: #include<stdio.h> int main() { int a=317; char *ptr; int *ptrr; ptr=(char *)&a; printf("%d\n",*ptr); return(0); } 317的二进制是00000001 00111101 61的值是00000000 00111101 这段代码中的指针似乎只访问一个字节,而不是两个。但是,如果我没有错的话,char和int指针的大小是相同的 为什么会发生这种情

对于以下一段C代码:

#include<stdio.h>

int main()
{
int a=317;
char *ptr;
int *ptrr;

ptr=(char *)&a;
printf("%d\n",*ptr);
return(0);
}
317的二进制是00000001 00111101

61的值是00000000 00111101

这段代码中的指针似乎只访问一个字节,而不是两个。但是,如果我没有错的话,char和int指针的大小是相同的


为什么会发生这种情况?

字符
int
指针的大小可能相同,但字符
int
的大小不同!!因此,当您使用指向字符类型的指针访问任何其他对象类型时,它会指向对象的最低地址字节。接下来,当您取消引用它时,您将得到该字节的值

引用第§6.3.2.3章中的
C11

[…]当指向对象的指针转换为指向字符类型的指针时, 结果指向对象的最低寻址字节。连续增量 结果,直到对象的大小,都会产生指向对象剩余字节的指针

也就是说,添加更多关于地址和间接寻址运算符的上下文§6.5.3.2

一元*运算符表示间接。如果操作数指向函数,则结果为 函数指示符;如果它指向一个对象,结果是一个左值,表示 对象[……]

对于
char
类型的“对象”,参见第§6.5.3.4章

sizeof
运算符生成其操作数的大小(以字节为单位),该操作数可以是 表达式或类型的括号名称。大小由类型决定 操作数。[……]

sizeof
应用于类型为
char
无符号char
带符号字符
,(或其限定版本)结果为1。[……]

因此,
char
类型的大小在C中定义为1(1字节),因此,解引用相应地发生。

指针基本上“指向”内存地址,指针的类型(例如
char*
int*
)定义了如何解释该内存地址的内容。因此,指针本身的大小是相同的,不管它是指向整数还是指向字符。但是,当访问指针指向的内容时(即,取消引用指针时),将根据指针的类型读取相应的值(即,
char
为一个字节,而
int
可能为4个字节)


ptr
将指向存储由
a
表示的对象的内存开始处。您案例中的结果是
61
还是
0
取决于您的系统采用的是大端结构还是小端结构。

因为字符是一个字节,而int不小于两个字节。指针的大小不重要,指针的大小很重要。
61