C++ コードで String* を読んで混乱しました。String* を使用する必要はありますか? 代わりに char* を使用できますか? たとえば、StreamReader には ReadLine() 関数があります。ユーザーが最初に char 配列を配置する必要がないのはなぜですか。関数は文字列を格納し、char* ポインターを返し、すべて正常に動作します。
3 に答える
char*
は単一の文字列または複数の文字(文字の配列)string*
へのポインタであり、は単一または複数の文字列オブジェクト(配列)へのポインタであることに注意してください。ただし、C#はマネージタイプ(文字列など)へのポインターをサポートしていません
例:
unsafe void f()
{
char ch = '3';
char* cPtr = &ch;
*cPtr = '4'; // ch == '4'
fixed (char* ccPtr = new char[30])
{
*(ccPtr + 15) = '4'; // arr[15] == '4'
}
string* ptr; // error: cannot declare a pointer to managed type
fixed (char* pptr = new string(new char[] { 'a', 'b', 'c' }))
{
pptr[2] = 'd';
}
}
私はあなたの質問を完全には理解していませんが、文字列*は単一の文字列ではなく文字列の配列を参照している可能性があります。その場合、char*は機能しません。お役に立てば幸いです。
C#では、文字列は通常、C#タイプstring
または.netタイプString
(同じもの)によって処理されます。char*
文字列のC/C++の考え方です。ポインターはC#に存在しますが、実際にはその方法ではありません(公式には安全ではありません)。文字配列は、char[]
ではなく、になりchar*
ます。
C#クラスでは、インスタンスは参照として保存され、構造体は値として保存されます。参照は、基本的にはポインターの管理バージョンです。クラスインスタンスを渡す場合は参照によってオブジェクトを渡し、構造体を渡す場合は値を渡します。つまり、C ++のクラス/構造体へのポインターとして渡すデータが必要な場合は、C#クラスを使用する必要があります。利点は、参照を渡すことと、ポインターを使用して実行できるようなこと(リンクリストなど)を使用できることです。欠点は、クラスをクラス内に配置すると、リダイレクトの数(したがってアクセス時間)が増えることです。データを値として格納する場合(たとえば、クラス内の構造体の間接参照の数を減らすため)、構造体を使用する必要があります。in
/ref
パラメータ。