繁体   English   中英

字符指针算术C.

[英]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 如果结果在该类型的对象中无法表示,则行为未定义。 换句话说,如果表达式PQ分别指向数组对象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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM