-1

ポインターは、コードで使用するロジックについて常に私を無意味にします. 誰かが本当に役立ついくつかの概念を理解するのを手伝ってくれるなら. これが私のプログラムのコードスニペットです。

vector <char> st; 
char *formatForHtml(string str, string htmlTag)
{ 
    string strBegin;
    strBegin = "<";
    strBegin.append(htmlTag);
    strBegin.append(">");
    strBegin.append(str);
    string strEnd = "</";
    strEnd.append(htmlTag);
    strEnd.append(">");
    strBegin.append(strEnd);
    st.resize(strBegin.size());
    for (int i =0;i <strBegin.size();i++) {
        st[i] = strBegin.at(i);
    }
    return &st[0];
}

上記のコードで のアドレスを返さなければならない場合st[0]、タイプ の関数を書かなければなりませんchar *。そうする理由を知る必要があります。また、アドレスが整数値の場合、関数をint型として定義できないのはなぜですか?

PS初心者レベルの疑問です。

4

6 に答える 6

0

ポインターはポインターであり、整数値ではありません。stがグローバル変数であるか、この関数で静的として宣言されている場合にのみ、コードは正しいです。ただし、戻り文字列は、戻りポインタよりも望ましいです。

于 2012-07-05T07:48:57.940 に答える
0

単純。

string str

たくさんのキャラクターが含まれているものです。

str[0]

最初の文字を返します。

したがって、

&str[0]

最初の文字のアドレスを示します。したがって、これは「char *」です---「char」はポインタが指すものであり、「*」はポインタの「アドレス」部分です。ポインタのタイプは、ポイントされているオブジェクトに関するものです。

また、アドレスはハードウェアレベルでは単なる「整数」である可能性があります(整数自体を除いて、すべてが整数です...整数の集まりです)が、それは高級言語にとっては何の意味もありません。高水準言語の場合、ポインターは整数ではなくポインターです。

お互いを別のものとして扱うことはほとんどの場合エラーであり、C ++ 11はnullptrキーワードを追加したので、1つの有効な「ポインターは整数」の場合に依存する必要はありません。

そしてところで、あなたのコードは機能しません。「str」は関数の期間中のみ存在するため、関数が「str」を返すと存在しなくなります。つまり、返されたポインターはどこにも大きな黒を指しません。

于 2012-07-05T07:49:34.493 に答える
0

関数の戻り型として文字列を使用してみませんか?

まず、ポインタはメモリ内にある何かのアドレスであるため、整数に置き換えることはできません(いくつかの汚いトリックでのみ)。

2番目:&st [0]は、文字列がコンテンツを格納するために使用する内部バッファのアドレスです。stがスコープ外になると(または次の呼び出しで再利用されると)、上書きされるか、ヒープマネージャーに戻されるため、この関数を呼び出すものはガベージで終了します。

ところで、ほとんどの関数は、文字列クラスがそれ自体で実行できる不要な作業を実行します(たとえば、strBeginをstにコピーします)。

于 2012-07-05T07:50:58.620 に答える
0

これは厄介なコードです。引数として 'str' を期待しているのに、そのメモリの場所を返しますか? 文字列自体を返さないのはなぜですか?

あなたのコードにはいくつかのタイプミスがあります。(「st」と入力したのは「str」のことですか?そうでない場合、「st」はどこに定義されていますか?)

関数を「int」型として定義できない理由は、「int」が「charへのポインター」とは異なる型であるためです。

個人的には、「string」を返し、最後に「return str」を付けるだけです。

于 2012-07-05T07:47:21.587 に答える
0

'char *' 型の関数を書かなければなりません。そうする理由を知る必要があります。

そうする理由はありません。を返すだけstd::stringです。

あなたのコードの外観から、ststd::vector<char>. std::vector連続メモリを持っているため、はベクトル&st[0]の最初のアドレスであるため、ベクトルが表す null で終了しないchar文字列を指します。これは、長さが見つからないため、関数の外ではあまり役に立ちません。

于 2012-07-05T07:46:41.233 に答える