字符指针算术C

时间:2015-07-31 04:35:24

标签: c char pointer-arithmetic

我正在学习指针算术,我遇到过这样的事情:

char *str1, *str2;

/* stuff in between */

int f = str2 - str1;

str2 - str1返回什么?让我们说str1 = "foo"str2 = "foobar"

3 个答案:

答案 0 :(得分:12)

您提出问题的结果未定义。要使指针差异正常工作,它们必须来自相同的数组序列(动态,自动,甚至自动VLA没有区别)。或过去最后一个元素的过去地址:

  

§6.5.6加法运算符(p9)

     

当减去两个指针时,两个指针都指向同一个数组对象的元素,或者指向数组对象的最后一个元素的元素;结果是两个数组元素的下标的差异。结果的大小是实现定义的,其类型(有符号整数类型)在ptrdiff_t标头中定义为<stddef.h>。如果结果在该类型的对象中无法表示,则行为未定义。换句话说,如果表达式PQ分别指向数组对象的i-thj-th元素,则表达式(P)-(Q)具有值i-j如果值适合类型为ptrdiff_t.的对象,此外,如果表达式P指向数组对象的元素或者指向数组对象的最后一个元素,并且expression 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)

<强>被修改

这个问题的答案取决于具体情况。

1)在你的情况下,由于指针没有指向任何东西,结果将是垃圾

2)如果两个指针指向程序空间中的两个有效内存位置,那么结果将是这两个位置之间的内存字节数。虽然这没有任何意义,并且根据C规范它是UB,如果两个指针没有指向相同的数组或字符串。如果两个指针指向同一个数组或字符串,则结果将是同一数组中两个元素之间的元素数(当指针指向该数组内的那两个元素时)。检查this SO问题以获取示例和更多解释。

答案 2 :(得分:0)

id = f中的内存地址 - str2中的内存地址。 str1"foo"是这些指针所指向的内存位置的值。

示例:

如果"foobar"

str2 = 0x8000000a

str1 = 0x80000000