[英]Char pointer to integer array
int main()
{
int x[] = {1, 2, 3};
char *p = &x;
printf("%d", *(p+1));
return 0;
}
我在代码块中运行代码,它的输出为0。 如果II将p更改为int指针,则其给出2作为输出。
int main()
{
int x[] = {1, 2, 3};
int *p = &x;
printf("%d", *(p+1));
return 0;
}
为什么这样?
当将p
声明为指向char
的指针时,它将指向1
个字节大小的数据。 因此(p + 1)
p
递增1个字节。
由于int
长度至少为4个字节,因此(p + 1)
可能指向1
高阶字节中的第二个,仍为0
。
如果您希望它具有相同的输出,则可以执行类似的操作
printf("%d\n", *(p + sizeof(int)));
但是最好避免使用此类代码,并使用-Wall
标志进行编译,这肯定会在您的情况下产生警告。
当您增加一个指针时,它会移动它所指向的对象的大小。
假设您有16位整数。 以二进制形式,数字为:0000 0000 0000 0001
一个char指针一次只能指向8位:0000 0000
从稍微不同的角度来看,关于二进制+
运算符, C99
标准的第6.5.6章第8段说:[强调我的]
将具有整数类型的表达式添加到指针或从指针中减去时,结果将具有指针操作数的类型。 如果指针操作数指向数组对象的元素,并且数组足够大,则结果指向与原始元素偏移的元素,以使结果数组元素和原始数组元素的下标之差等于整数表达式 。 换句话说,如果表达式P指向数组对象的第i个元素,则表达式(P)+ N(相当于N +(P))和(P)-N(其中N的值为n)表示到数组对象的第i + n个元素和第i-n个元素(如果存在)。
因此,在您的第一种情况下 , p
的类型为char *
并且(p + 1)
给出的结果是一个指针,该指针以sizeof(char)
递增[ 多数情况下为1字节],因此指向第二个元素p
持有的char数组的p
。 由于实际上,由p
保留的数组的类型为int
[在32位系统中,假设长度为4个字节],因此,根据存储的值,[ 1
被存储为0000 0000 0000 0001
], *(p+1)
打印出0
。
OTOH,在第二种情况下 , p
的类型为int *
并且(p + 1)
给出的结果是指针,该指针的sizeof(int)
增加sizeof(int)
,因此指向p
持有的int数组的第二个元素。 由于实际上,由p
保留的数组的类型为int
,因此根据存储的值,[ int x[] = {1, 2, 3};
], *(p+1)
打印2
。
假设sizeof(int)是16位。 二进制2是0000000000000010。sizeof(char)是8位。 小字节序和大字节序是存储多字节数据类型的两种方式。
考虑以下代码:
int i = 2; char c =(char )&i; 如果((* c)== 2)
printf(“小端”); 否则//如果* c为0 printf(“ Big endian”);
从此代码可以得出结论,Big Endian将2存储为0000000000000010。但是Little Endian将其存储为0000001000000000。,所以零,因为输出将意味着前8位为零,因此系统为Big Endian。 如果一直使用Little Endian,答案应该是2,因为char p只能指向8位。 实际上,声明指针的数据类型意味着要指定您希望它引用的任何位以及递增后它将跳多少位。 如果在此示例中,由于p是char指针,则*(p + 1)将在Big endian中引用00000010,在Little Endian中引用00000000。 您的编译器可能正在使用32位整数,因此我认为在两种情况下,*(p + 1)都将为0。(因为2 => 00000000 00000000 00000000 00000010从任一侧来的第二个字节为0)
参见:`#include
int main()
{
int x[] = {1, 2, 3};
char *p = &x;
printf("%d\n", *p);
printf("%d\n", *(p+1));
printf("%d\n", *(p+2));
printf("%d\n", *(p+3));
printf("%d\n", *(p+4));
printf("%d\n", *(p+5));
printf("%d\n", *(p+6));
printf("%d\n", *(p+7));
printf("%d\n", *(p+8));
return 0;
}`
输出:1 0 0 0 2 0 0 3
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.