const char* occurs(const char* s1, const char* st){
if(length(st)>length(s1)){
return 0;
}
int diff=length(s1)-length(st);
int i=0, j=0, k=0;
for(;i<=diff;i++){
j=i;
while(s1[j]==st[k] && st[k]!='\0'){
k++;
j++;
}
if(st[k]=='\0') return &s1[i];
}
return 0;
}
此函数返回另一个字符串中第一次出现的字符串。在我的主要功能中,我称之为:
const char* occ = occurs(argv[1], argv[2]);
std::cout << &occ << " - " << occ << std::endl;
令我困惑的是:作为一个指针,不应该通过将变量写为is(occ)来获取地址,并通过解除引用它来获取地址(* occ)? 为什么它似乎像普通变量一样工作(使用&amp; occ获取地址,使用occ获取值)? 如果我把它当成一个数组,C ++会改变指针吗?如果我通过将s1和st视为指针来解决问题,而不使用数组语义,那么它对于内存是否相同?
答案 0 :(得分:2)
您忘记了C样式的字符串(实际上称为空终止字节字符串)由<<
运算符的特殊重载处理,以打印字符串本身。
使用&occ
打印的内容是occ
变量本身的地址,而不是它所指向的位置。
如果要打印occ
变量中包含的值(即它指向的位置),则需要将其转换为指针类型,该类型不像字符串那样处理。像例如static_cast<const void*>(occ)
。
答案 1 :(得分:0)
是的,c ++确实改变了一些东西。 你已经将函数的“返回”类型设置为const char *,所以这基本上会返回指向变量地址的指针。 但是在你的程序中你已经返回了一个常量值“0”,c ++所做的是它没有把它看成是一个r值(这会导致0以外的值出错)它看起来好像它是一个空指针,这也是它没有给出错误的原因。 所以当你这样做时: -
const char * occ =发生(argv [1],argv [2]); “occ”指的是一个无效的地址,这就是为什么它没有像你预期的那样工作。
无论如何,这是我的解释,随时可以确认,因为它可能无法准确回答您的问题。