9

私が理解しているように、MSDN C# によると、固定ステートメントは次のように機能するはずです。

fixed (char* p = str) ... // equivalent to p = &str[0]

それで、なぜ私はこれができないのですか?

    const string str = "1234";
    fixed (char* c = &str[0])
    {
/// .....
    }

str[1]たとえば、へのポインターを取得するにはどうすればよいですか?

4

4 に答える 4

7

後の要素へのポインターの取得は配列では直接機能しますが、文字列では機能しないため、MS がそれを実装しなかったことが唯一の理由のようです。配列のセマンティクスに従って、そのように設計することは容易に可能でした。

ただし、他の配列要素を指す別のポインターを簡単に計算できます。したがって、実際には大きな問題ではありません。

fixed (char* p = str)
{
   char* p1 = p+1;
}
于 2013-04-10T07:17:58.873 に答える
4

これは[]、文字列の演算子が値を返すメソッドであるためです。プリミティブ値型の場合のメソッドからの戻り値にアドレスがありません。

[]C# の operator は C と同じではありません[]。C では、配列と文字列は単なるポインターであり[]、ポインターに operator を適用することは、ポインターを移動して逆参照することと同じです。これは C# には当てはまりません。

実際、リンクした MSDN ドキュメントにエラーがありましたが、最新バージョンでは修正されています。

この正確な問題の詳細については、こちらを参照してください。

于 2013-04-10T07:05:55.113 に答える
1

ステートメントのポイントはfixed、メモリ割り当てが仮想メモリを越えて移動しないようにすることです。メモリ割り当ては、他のアドレスではなく、先頭で識別されます。

したがって、修正を続けるには、全体を修正&str[1]する必要があります。str次に、ポインター演算を使用して、固定ポインターから単一の割り当て内の他のポインターstrを必要に応じて派生させることができます。

于 2013-04-10T07:09:25.860 に答える
0

コードを次のように変更します。

char[] strC = "1234".ToArray();
fixed (char* c = &strC[0])
{
    /// .....
}
于 2013-04-10T07:09:59.187 に答える