2017-10-28 15 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の値を取得する)? 配列のように扱うと、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スタイルの文字列へのポインタが格納されているセルのアドレスです。もしCスタイルの文字列ではなく、配列へのポインタ(または何かへのポインタ)があったら、 'std :: cout << occ << - << << * occ << std :: endl; '実際に' address-value'を見るには、それは正しいのですか? – Dodicin

+0

@Dodicin文字列は実際には文字の配列であり、それを終端する特殊文字はありません。だから文字列を持たない限り(例えば 'occ 'が' int * 'だった場合)、それは正しいです。また、 'occ'が配列の最初の要素を指す場合、' * occ'はその最初の要素の値を返します。これは 'occ [0]'と等価です。 –

+0

説明をありがとう! – Dodicin

0

はい、C++が何かを変更しました。 const char *に関数 "戻り"の戻り値の型を設定しているので、これは基本的にポインタを変数のアドレスに返します。 しかしあなたのプログラムでは、const r値 "0"を返しました。これはr値(これは0以外の値のエラーにつながります)としてこれを見ていないということです。それがヌルポインタだった場合、それはエラーを与えなかったのです。 これを実行したとき: -

const char * occ = occur(argv [1]、argv [2]); "occ"は無効なアドレスを指していたので、期待通りに動作しませんでした。

これは私の説明だったので、あなたの質問に正確に答えられないかもしれないので、それを確認してください。

+0

それはそれだとは思わない!私は0がヌルポインタと見なされることを知っていますが、 '<<"オーバーライドは予期せぬ動作を説明しています。 – Dodicin

関連する問題