考虑以下代码:
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。
我想知道将指针指定为整数和字符的重要性。
答案 0 :(得分: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.
答案 1 :(得分:1)
作为指针,基本上没有区别。区别在于取消引用指针和分配值。
类型char是字节宽类型。这意味着,它可以存储8位信息。因此char类型可以存储-127到126的数字。
Type int是一个4字节宽的类型,因此它可以存储32位信息。您可以应用相同的概念,以查看可以存储的最大值和最小值。
您可以了解更多here
答案 2 :(得分:1)
指针的类型决定了编译器对指向数据的大小和布局做出的假设。在您的示例中:
char *p3=&a
假设 &a
保持char
值,因此长度为一个字节。这当然不是真的,因为int
至少有两个字节长(并且通常是四个字节长)。现在你仍然得到100的价值的原因是因为你很可能在兼容英特尔的CPU上运行这个代码,其中字节以小端格式存储。在这种格式中,首先存储最低有效字节,而不是最后存储。如下所示存储值为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
之后四个字节的内存地址。