任何人都可以解释为什么在使用
后得到结果4
a[]="informatics";
cout<<strchr(a, 't')-(a+3);
我不应该得到-4
的结果吗?
因为我从"tics"
中减去了较短的字符串("ormatics"
)。在我看来,如果我有"ormatics-tics"
,那么返回一个字符串orma
,而不是一个数字是有意义的。
为什么会这样,我无法找到这件事的参考。另外,当我尝试同样的事情时,在我完成strchr
返回后,我得到了-4
:
cout<<" tics"-"ormatics";`
有人可以解释一下吗?
答案 0 :(得分:3)
a
保存指向包含"informatics"
的char数组的第一个字符的指针。
strchr(a, 't')
返回指向第一个&#34; t&#34;的指针。 (这是第8个字符)
结果是a+7
。
因此您的计算结果为:
strchr(a, 't')-(a+3)
== (a+7)-(a+3)
== 7-3
== 4
修改强>
这个答案有点误导,因为它暗示a
是一个指针
这是错的! a
是一个数组而不是指针
这里的差异最好解释一下:c-faq - Arrays and Pointers
更好的措辞是数组通常像指针一样使用,因为有些操作只使用数组第一个元素的地址。
改进的计算可能如下所示:
strchr(a, 't')-(a+3)
== (&a[0] +7)-(&a[0] +3)
== 7-3
== 4
(感谢Martin Bonner指出这一点。)
答案 1 :(得分:2)
你正在做一个指针减法。
这就是发生的事情:
所以strchr(a, 't')-(a+3)
是,
(0+7)-(0+3) => 4
*为简单起见,我认为a
为0
注意:当你减去两个指针时,只要它们指向 相同的数组,结果是分隔它们的元素数量
答案 2 :(得分:1)
" tics"-"ormatics"
减去两个任意const char*
指针。不能对差异做出任何预测。
与他们实际的字符串内容完全没有关系。
答案 3 :(得分:0)
让我举出你的例子:
const char a[]="informatics"; // a is an array with 12 elements (inc terminator).
const char* const pa = a; // pa is a pointer to char. Let us say for the sake of
// argument it has value 0x1000
const auto pt = strchr(a,'t') // pt will be a pointer with value 0x1007
const auto ap3 = a+3 // ap3 will be a pointer with value 0x1003
const auto diff = pt - ap3; // diff will be type ptrdiff_t, and given the values
// above, you shouldn't be surprised it has
// value 4.
std::cout<<diff<<std::endl; // Will output "4".