-2

考虑这段代码:

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。

我想知道将指针指定为整数和字符的意义。

4

3 回答 3

5

另一个区别在于当您增加指针时,每个指针都会增加其对应的元素类型。

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.
于 2013-08-11T11:33:58.977 回答
2

作为指针,基本上没有区别。不同之处在于取消引用指针和分配值时。

char 类型是字节宽类型。这意味着,它可以存储 8 位信息。所以 char 类型可以存储从 -127 到 126 的数字。

int 类型是 4 字节宽的类型,因此它可以存储 32 位信息。您可以应用相同的概念来查看可以存储的最大值和最小值。

你可以在这里了解更多

于 2013-08-11T11:35:35.693 回答
1

指针的类型决定了编译器对所指向数据的大小和布局所做的假设。在您的示例中:

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

于 2013-08-11T11:53:29.707 回答