[英]Char pointer arithmetic C
我正在学习指针算术,我遇到了这样的事情:
char *str1, *str2;
/* stuff in between */
int f = str2 - str1;
什么是str2 - str1
返回? 假设str1 = "foo"
和str2 = "foobar"
。
您提出问题的结果未定义。 要使指针差异正常工作,它们必须来自相同的数组序列(动态,自动,甚至自动VLA没有区别)。 或过去最后一个元素的过去地址:
§6.5.6加法运算符(p9)
当减去两个指针时,两个指针都指向同一个数组对象的元素,或者指向数组对象的最后一个元素的元素 ; 结果是两个数组元素的下标的差异。 结果的大小是实现定义的,其类型(有符号整数类型)是在
<stddef.h>
头中定义的ptrdiff_t
。 如果结果在该类型的对象中无法表示,则行为未定义。 换句话说,如果表达式P
和Q
分别指向数组对象j-th
i-th
j-th
元素,则表达式(P)-(Q)
具有值i-j,条件是该值适合于ptrdiff_t.
类型的对象ptrdiff_t.
此外,如果表达式P
指向数组对象的元素或者指向数组对象的最后一个元素,并且表达式Q
指向同一数组对象的最后一个元素,则表达式((Q)+1)-(P)
具有与((Q)-(P))+1
和-((P)-((Q)+1))
的值,并且如果表达式P
指向一个,则值为零数组对象的最后一个元素,即使表达式(Q)+1
没有指向数组对象的元素。 106
也就是说,如果你改写以符合上述规则,那就像:
#include <stdio.h>
int main()
{
const char *p = "Hello World";
const char *q = p+7;
printf("%td\n", q-p);
return 0;
}
产量
7
并且从标准的引用部分解释了原因。
编辑
这个问题的答案取决于具体情况。
1)在你的情况下,因为指针没有指向任何东西,结果将是垃圾
2)如果两个指针指向程序空间中的两个有效存储器位置,则结果将是这两个位置之间的存储器的字节数。 虽然这没有任何意义,并且根据C规范它是UB,如果两个指针没有指向相同的数组或字符串。 如果两个指针指向同一个数组或字符串,则结果将是同一数组中两个元素之间的元素数(当指针指向该数组内的那两个元素时)。 请查看此 SO问题以获取示例和更多说明。
f
= str2
存储器地址 - str1
存储器地址。 "foo"
和"foobar"
是这些指针指向的这些内存位置的值。
例:
如果str2 = 0x8000000a
和str1 = 0x80000000
str2 - str1 = 0x8000000a - 0x80000000
str2 - str1 = 0x0a
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.