为什么在C中使用字符指针访问整数变量会导致只截断一个字节?
对于以下一段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指针的大小是相同的 为什么会发生这种情
#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