C 整数指针和字符指针的主要区别是什么?
考虑以下代码:C 整数指针和字符指针的主要区别是什么?,c,C,考虑以下代码: 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 w
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
值,因此长度为一个字节。这当然不是真的,因为int
至少有两个字节长(通常是四个字节长)。现在,您仍然从中获取值100的原因是,您很可能在与Intel兼容的CPU上运行此代码,其中字节以little endian格式存储。在这种格式中,最低有效字节存储在第一位,而不是最后一位。值为100的四字节整数存储如下(十六进制表示法):
p3
指向该序列的第一个字节。因此,p3
指向的内存包含一个值为100的字节。如果要在此布局中使用值:
0x00 0x64 0x00 0x00
即25600:
int a=25600;
然后,您将得到的*p3
值为0,因为只考虑第一个字节
除此之外,
*(p3+1)
的值为100,因为将char
指针增加1将导致指向下一个字节(其值为100)的指针。这与*(p1+1)
不同,后者将为您提供一个位于p1
之后四个字节的内存地址,现在请尝试再次运行它,但使用int a=1000
。我希望*p3
和**p4
返回'd'
(当然,假设是ASCII字符集)。char
也是一个整数类型,它最多可以存储255个字符(在无符号的情况下,即我考虑的是最大值),如果你取的值大于255,你可能会得到不可预知的结果,正如Oli所描述的,只需尝试使用int a=1000
运行它,例如char
指针表示指向至少1个字节的内存位置的指针,而int
指针表示指向4个字节(至少2个)的内存位置的指针。“作为指针,基本上没有区别。”。不是真的。尝试递增每个指针。我的意思是,它们都是指针,大小相同,函数相同,指向内存位置。但它们指向不同的东西,当它们指向不同的东西时,在不同的宽度上,当它们递增时,它们以不同的方式递增(字符指针递增1,整数指针递增4)。
int a=25600;