为什么C中的指针减法产生一个整数?

Căl*_*lin 6 c pointers

为什么如果我从指针中减去另一个没有类型转换结果的指针(整数指针)将是1而不是4个字节(就像我将这两个指针强制转换为int时).示例:

int a , b , *p , *q;
p = &b;
q = p + 1; // q = &a;
printf("%d",q - p); // The result will be one .
printf("%d",(int)q - (int)p); // The result will be 4(bytes). The memory address of b minus The memory address of a.
Run Code Online (Sandbox Code Playgroud)

Vla*_*cow 5

根据 C 标准(6.5.6 加法运算符)

9 当两个指针相减时,两个指针都指向同一个数组对象的元素,或者指向数组对象最后一个元素之后的一个;结果是两个数组元素下标的差......

如果两个指针指向同一个数组的元素,那么正如标准引用中所说

结果是两个数组元素的下标之差

也就是说,您将获得这两个指针之间的数组元素的数量。它是所谓的指针运算的结果。

如果将存储在指针中的地址作为整数值相减,那么您将得到与算术减法运算相对应的数字。

  • 您在粗体文本之后立即忽略了“或最后一个元素”。`q - p` 有效。(但是使用了错误的格式说明符)。 (2认同)

art*_*rtm 3

为什么如果我从一个指针中减去另一个指针(整数指针)而不进行类型转换,结果将是 1 而不是 4 个字节

这就是指针指向的数据类型的全部要点。查看如下所示的数组上下文可能更容易。要点是,无论底层数据类型如何(此处longdouble),您都可以使用指针算术来导航数组,而无需关心其元素的大小到底是多少。换句话说,(pointer + 1)表示指向下一个元素,无论类型如何。

long l[] = { 10e4, 10e5, 10e6 };
long *pl = l + 1;    // point to the 2nd element in the "long" array.

double d[] = { 10e7, 10e8, 10e9 };
double *pd = d + 2;    // point to the 3rd element in the "double" array.
Run Code Online (Sandbox Code Playgroud)

另请注意您的代码:

int a , b , *p , *q;
p = &b;
q = p + 1; // q = &a;   <--- NO this is wrong. 
Run Code Online (Sandbox Code Playgroud)

事实上,ab声明为彼此相邻,并不意味着ab分配在内存中彼此相邻。q指向紧邻的内存地址也是如此-b但该地址中的内容是未定义的。