为什么strstr() - char指针=数字?

yie*_*tem 2 c++ pointers strstr

我有这个程序:

#include <iostream>
#include <conio.h>
#include <string.h>

using namespace std;

int main()
{
  char char1[30] = "ExtraCharacter", char2[30] = "Character", *p;

  p = strstr(char1, char2);
  cout << "p: " << p << endl;
  cout << "char1: " << char1 << endl;
  cout << "(p-char1): " << (p-char1) << endl;

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

当我运行它时,我得到:

p: Character
char1: ExtraCharacter
(p-char1): 5
Run Code Online (Sandbox Code Playgroud)

正如所料.

但这不是问题,我不确定为什么"Character" - "ExtraCharacter"是整数(5)?也许不是整数,而是数字/数字.实际上我不明白为什么存储"Character" p,而不是内存地址.

如果我从书中理解得很好,strstr()返回一个内存地址,它不应该更像是一个奇怪的值,比如十六进制(0x0045fe00)或类似的东西吗?我的意思是,它cout << p不是cout << *p显示该内存地址的实际值.

谁能解释一下它是如何工作的?

PS:如果标题不那么连贯,我道歉.

Sla*_*ica 6

但这不是问题,我不确定为什么"Character" - "ExtraCharacter"是一个整数(5)?

你从另一个指针和结果中减去一个指针 - 数字,从char char1点到点的距离char p.这是指针算法的工作原理.

注意:此减法仅在两个指针指向同一个数组(或最后一个元素后面)时有效,这在代码中就是这种情况,但您需要小心.例如,如果strstr()没有找到susbtring那么它将返回nullptr并且你的减法将具有UB.所以至少p在减去之前检查(并且传递nullptrstd::cout也会有UB)

如果我从书中理解得很好,strstr()会返回一个内存地址,它不应该更像是一个奇怪的值,比如十六进制(0x0045fe00)或类似的东西吗?我的意思是,它是cout << p not cout <<*p来显示该内存地址的实际值.

是的p是指针也称为记忆地址.std::ostream有特殊规则如何打印指向char的指针 - 作为字符串,因为C中的字符串以这种方式存储.如果你想把它看成一个指针,只需要它:

std::cout << static_cast<void *>( p );
Run Code Online (Sandbox Code Playgroud)

然后你会把它看作一个地址.

  • 您可能还想提到这个减法是UB,因为指针不属于同一个对象/数组 (2认同)