3

たとえば、なぜ必要なのchar **myVariable;ですか?ポインターがメモリ内の単なるアドレスである場合、char を持つアドレスへの単なるポインターではなく、char のアドレスへのポインターを持つアドレスへのポインターである場合、どのような違いが生じるのでしょうか?

アセンブリでは、これは次のようではありません

LDR R3, =myVariable
LDR R2, =[R3]
LDR R1, =[R2]
LDR R0, =[R1]

単一のポインタがある場所

LDR R1, =myVariable
LDR R0, =[R1]

現在R0値を保持していますか?明らかに、この方法の方が高速です。

4

7 に答える 7

11

関数によってポインターの値を変更する場合は、そのポインターのアドレスを参照によって関数に渡す必要があります。したがって、引数としてポインタへのポインタが必要になります。

例 :

int main()
{
  int num=0;
  int *p = #
  // This function passes the pointer by value. 
  //So when function returns, *p points to same place
  fn(p);

  // This function will actually change where the pointer points to as 
  // it was passed by reference
  fn2(&p);
}
void fn(int *ptr)
{
    static int i=1;
    ptr = &i;
}
void fn2(int **ptr)
{
    static int j=1;
    *ptr = &j;
}
于 2013-05-14T05:07:40.353 に答える
10

ポインタのテーブルがある場合、そのテーブルへのポインタは「ポインタへのポインタ」型になります。

于 2013-05-14T05:08:43.410 に答える
2

上記の返信は、質問の最初の部分に対処しています。2 番目の部分への回答「char を持つアドレスへの単なるポインターではなく、char のアドレスへのポインターを持つアドレスへのポインターである場合、どのような違いがありますか?」

メモリ レイアウトに関しては、あなたの言っていることは正しいのですが、C/C++ はその型に応じてポインターを処理します。ポインター++を実行すると、ポインターが指しているデータ型のサイズだけポインターがインクリメントされます。整数へのポインターの場合は 4 ずつインクリメントされ、文字へのポインターの場合は 1 ずつインクリメントされ、サイズ 20 の構造体へのポインターの場合は 20 ずつインクリメントされます。

于 2013-05-14T05:31:31.200 に答える
1

ポインターの格納とその処理を処理する場合は、ポインターへのポインターが必要です。たとえば、基になるポインターの内容を変更します。例えば:

int i = 0, j = 1;
int* p = &i;
int** pp = &p;

の代わりにをp指摘したい場合は、次のようにできます。ji

*pp = &j;  // equivalent to `p = &j;`

これは説明用です。現実の世界では、関数を扱うときにこれが必要です。

void Destroy (int** pp) {  // for any int pointer
  delete[] pp;  // deallocate the memory
  *pp = 0;  // set the pointer to 0, so that it's not dangling
}

そしてそれを次のように使用します:

int* pi = new int[30];
...
Destroy(&pi); // `pi` is now pointing to 0

しかし、それでも C++ では、「ポインター参照」として優れた代替手段があります。これはほとんど同じことを行いますが、読みやすくなっています。

void Destroy (int*& p) {  // for any `int` pointer 
  delete[] p;  // destroy the memory
  p = 0;  // Null out the same pointer which was actually passed
}

使用:

Destroy(pi);  // no need to pass address
于 2013-05-14T05:10:50.937 に答える
0
  1. ポインターがあり、ポインターの値が重要であるとしましょう。たとえば、ポインターは配列内の要素を指します。次に、そのポインターを使用して関数を呼び出します。これは、それを入出力パラメーターとして意味するため、関数はそれを変更します。この場合、これはゲームにもう 1 つの間接化を追加し、ポインターのポインターを関数に渡すことで可能になるため、ポインターを変更できます。
  2. @Lindyracer の: ポインターの配列。
  3. 一部のOSでは、「グローバル」ポインターを取得すると、二重間接参照が使用されます(通常、typedefで定義された型として取得します)。この背後にある理由は、ダブル ポインターを格納すると、メモリ マネージャーはそのダブル ポインターが指すポインターを自由に変更できるため、移動したり、デフラグしたりできるからです。

他にもたくさんあります。

于 2013-05-14T05:08:43.410 に答える