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:如果标题不那么连贯,我道歉.
但这不是问题,我不确定为什么"Character" - "ExtraCharacter"是一个整数(5)?
你从另一个指针和结果中减去一个指针 - 数字,从char char1点到点的距离char p.这是指针算法的工作原理.
注意:此减法仅在两个指针指向同一个数组(或最后一个元素后面)时有效,这在代码中就是这种情况,但您需要小心.例如,如果strstr()没有找到susbtring那么它将返回nullptr并且你的减法将具有UB.所以至少p在减去之前检查(并且传递nullptr到std::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)
然后你会把它看作一个地址.