考虑这段代码:
int a=100;
int *p1=&a,**p2=&p1;
char *p3=&a,**p4=&p3; //Here *p1,*p3,**p2,**p4 all return 100
p4=&p1;
p2=&p3;
*p1
, *p3
,**p2
并且**p4
都返回 100。
我想知道将指针指定为整数和字符的意义。
考虑这段代码:
int a=100;
int *p1=&a,**p2=&p1;
char *p3=&a,**p4=&p3; //Here *p1,*p3,**p2,**p4 all return 100
p4=&p1;
p2=&p3;
*p1
, *p3
,**p2
并且**p4
都返回 100。
我想知道将指针指定为整数和字符的意义。
另一个区别在于当您增加指针时,每个指针都会增加其对应的元素类型。
char *str1;
int *str2;
if you will look at the size of both the pointers lets assume
str1=4 bytes,str2=4 bytes
str1++ will increment by 1 byte but str2++ will increment 4 byte.
Reason: The ++ operator increments the pointer by the size of the pointed type.
作为指针,基本上没有区别。不同之处在于取消引用指针和分配值时。
char 类型是字节宽类型。这意味着,它可以存储 8 位信息。所以 char 类型可以存储从 -127 到 126 的数字。
int 类型是 4 字节宽的类型,因此它可以存储 32 位信息。您可以应用相同的概念来查看可以存储的最大值和最小值。
你可以在这里了解更多
指针的类型决定了编译器对所指向数据的大小和布局所做的假设。在您的示例中:
char *p3=&a
&a
假定保存一个char
值,因此是一个字节长。这当然不是真的,因为 anint
至少有两个字节长(通常是四个字节长)。现在您仍然从中获得值 100 的原因是因为您很可能在与 Intel 兼容的 CPU 上运行此代码,其中字节以 little-endian 格式存储。在这种格式中,最低有效字节首先存储,而不是最后存储。一个值为 100 的四字节整数存储如下(十六进制表示法):
0x64 0x00 0x00 0x00
p3
指向该序列的第一个字节。因此, 指向的内存p3
包含一个值为 100 的字节。如果您要在此布局中使用一个值:
0x00 0x64 0x00 0x00
这是25600:
int a=25600;
那么您将获得的*p3
值为 0,因为仅考虑第一个字节。
除此之外, 的值为*(p3+1)
100,因为将char
指针递增 1 将导致指向下一个字节(其值为 100)的指针。这与 不同*(p1+1)
,后者会给您一个位于四个字节之后的内存地址p1
。