使用指针作为数组,返回引用

时间:2017-10-28 13:21:44

标签: c++

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视为指针来解决问题,而不使用数组语义,那么它对于内存是否相同?

2 个答案:

答案 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”指的是一个无效的地址,这就是为什么它没有像你预期的那样工作。

无论如何,这是我的解释,随时可以确认,因为它可能无法准确回答您的问题。