2017-10-28 25 views
1
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; 

什么让我困惑的是:是OCC指针,我不应该写的变量是(OCC)和提领它的价值得到地址(* OCC)? 为什么它看起来像一个正常的变量(获取地址与& occ和值occ)? 如果我把它看作一个数组,C++是否会改变一个指针?如果我通过将s1和st作为指针来解决问题,而不使用数组语义,那么对于内存来说它会是一样的吗?

+1

输出运算符'<<'为'const char *'特殊重载以打印c样式字符串。 – user0042

+0

一次又一次地调用'length'不是一个好主意。更好的使用'str :: string' –

+0

我看,不知道'''。另外,我知道这不是一个好主意,它只是一个练习来理解更好的指针/数组(因此不使用'str :: string'),并且我不打扰在不同变量中保存长度,哈哈。 – Dodicin

回答

2

您忘记了C样式的字符串(真正调用空终止的字节字符串)由<<运算符的特殊超载来处理,以便打印字符串本身。

&occ打印的内容是occ变量本身的地址,而不是它指向的地方。

如果要打印occ变量(即它指向的位置)中包含的值,则需要将其转换为不特别像字符串处理的指针类型。像例如static_cast<const void*>(occ)

+0

因此,&occ是存储指向C风格字符串的指针的单元格的地址?如果occ不是C风格的字符串,而是一个指向数组的指针(或指向某个指针的指针),那么我必须编写'std :: cout << occ <<“ - ”<< * occ << std :: endl;'实际看到'地址 - 值',是否正确? – Dodicin

+0

@Dodicin一个字符串实际上只不过是一个字符数组,用一个特殊字符终止它。所以只要你没有字符串(如果'occ'是'int *'),那么是的,这是正确的。还要记住,如果'occ'指向数组的第一个元素,那么'* occ'会给你第一个元素的值,它等于'occ [0]'。 –

+0

感谢您的澄清! – Dodicin

0

是的,C++确实改变了一些东西。 你已经设置函数的返回类型“发生”为const char *,所以这基本上返回指向变量地址的指针。 但是在你的程序中你已经返回了一个常量值“0”,C++所做的就是它没有把它看作一个r值(这会导致0以外的值出错),它将它看作如果它是一个空指针,那就是为什么它也没有给出错误。 所以当你这样做: -

const char * occ = occurrence(argv [1],argv [2]); “occ”指向一个无效地址,这就是为什么没有按照您预期的那样工作。无论如何,这是我的解释,随时可以确认它,因为它可能无法准确回答你的问题。

+0

我不认为就是这样!我知道0被认为是一个空指针,但是'''覆盖解释了我没有更好理解的意外行为。 – Dodicin