私はいくつかのコードと、コンパイラから生成された '**
'変数の前のトークン(例:** variablename unreferenced--または何か、正確に思い出せない)。これがポインターに関連していることはかなり確信しています。2回逆参照しようとしているように思える場合。 '**
'はかなりグーグル化できません。誰かが良いウェブサイト/ドキュメントを教えてくれますか、または誰かがそれをここで説明したいと思いますか?
ありがとう。
素晴らしい反応。私が追加できる場合、ポインターへのポインターがあると便利な状況は何ですか?元のポインターへの別のポインターを作成する代わりに、元のポインターを使用するだけではいけませんか?
**は、実際には(宣言のように)ポインターへのポインターであるだけでなく、(ステートメント内の)間接参照の間接参照でもあります。
参照用の&表記がないCでよく使用されます。ポインタ型の戻り値を更新するには:
int alloc_foo(struct foo **foo_ret)
{
*foo_ret = malloc(sizeof(struct foo));
return 1; /* to indicate success; return value in foo_ret */
}
Main()の署名を認識できます:
int main(int argc, char* argv[])
以下は同等です:
int main(int argc, char** argv)
この場合、argvはchar *の配列へのポインターです。
Cでは、インデックス演算子[]は、ポインタ演算を実行するもう1つの方法です。例えば、
foo[i]
と同じコードを生成します
*(foo + i)
**
トークンではありません。単に*
トークンの後に別の*
トークンが続きます。あなたの場合、ポインターへのポインターがあり、実際に指し示されているものを取得するために2回参照解除されます。
**
は、ポインターへのポインターです。
マトリックス(配列の配列)または文字列の配列(char
配列)などです。
これは二重の逆参照です。
int i = 3;
int* ptr_to_i = &i;
int** ptr_to_ptr_to_i = &ptr_to_i;
std::cout << **ptr_to_ptr_to_i << std::endl;
プリント3。
ポインターへのポインターの使用法のいくつかを強調したかっただけです。これらのほとんどareは他の投稿に触れていますが、繰り返しが役立つと思いました。
これにより、呼び出し先は、呼び出し元が所有するポインターをmodifyできます。たとえば、文字列の先頭へのポインタへのポインタを渡すことができ、呼び出し先は、特定の文字が発生する文字列内の位置を指すように指すポインタを変更できます。
配列はポインターに低下するため(およびポインターは配列として扱うことができます)、次の場合はポインターへのポインターが表示されることがよくあります。
配列へのポインター。 「文字列」(とにかくCスタイルの文字列)は実際にはchar
sの単なる配列であるため、これは上記のケースの一般化です。
ポインターの配列。たとえば、ポリモーフィズムを可能にするオブジェクトへのポインターの配列、または別のコレクションに格納されているオブジェクトを選択するためのポインターの配列があります。
配列の配列。繰り返しますが、配列はポインターに劣化するため、これは上記の特定のケースです。これは、いわゆる「ギザギザ」配列(長方形ではなく)によく使用されます。
文字通り解釈できます- ポインタへのポインタ
int **var
ポインターへのポインターを宣言します**var
ポインターのコンテンツを参照します。ポインター自体はポインターを指します一般的な用途の1つは、関数がポインターをNULLに設定できるようにすることです。
。
代わりにmy_free(** pointer)を宣言し、my_free(&pointer)を呼び出して、my_free()がポインターを解放した後にnullに設定できるようにします。
これは、C++ Sigilの魅力の1つです。私自身の個人的な経験から、STLの配列とベクターの間接参照演算子を使用して、より高速で効率的な読み取りアクセスパフォーマンスを保証できます。好奇心が強い場合は、習慣的な共有ポインターメソッドも採用しています。 :)