1

temp2ととはどう違いますか はどう違いますtemp3

node* temp2 = head;
node** temp3 = &head;
4

5 に答える 5

6

ポインターへのポインターとポインターの違いは何ですか

実際には両方のポインタは同じです: メモリに格納されたメモリ位置。それらは、それらが指すメモリ位置に格納されているものだけが異なります。

メモリ、アドレス、ポインタ

プログラマーの観点から見ると、コンピューターのメモリはペアのリストと考えることができます。

  • 住所

名前付きの各オブジェクト/変数nameは、

  • 特定の値 ( 経由でアクセスname)
  • 特定のメモリアドレス ( 経由でアクセス&name)

したがって、メモリ値/アドレスのペアの 1 つです。

node(簡単にするために)が整数型であると仮定しましょう。head値で定義すると631:

node head = 631; 

特定のメモリ位置 (つまり0x002) が選択され (コンパイラがオフセットを選択し、OS がメモリ内の最終位置を指示します)、値631がその位置に格納されます。

----------------------------------
| | 住所 | | ヴァル | 名前 |
----------------------------------
| | 0x002 | 631 | 頭 |
----------------------------------

head現在 (そして唯一) は、特定のメモリ位置 (0x002この例では) の値のエイリアスまたは名前です。

ポインターを定義すると、何も変わりません。

node* temp2 = &head; // &head == 0x002

再びメモリ位置が選択され (すなわち0x005)、値 ( 0x002) がその位置に格納されます。

----------------------------------
| | 住所 | | ヴァル | 名前 |
----------------------------------
| | 0x005 | 0x002 | temp2 |
----------------------------------

また、変数名temp2は、に格納されている値の単なるエイリアスです0x005

また同じtemp3です。

node** temp3 = &temp2; // &temp2 == 0x002

対応するアドレス/値のペア:

----------------------------------
| | 住所 | | ヴァル | 名前 |
----------------------------------
| | 0x007 | 0x005 | temp3 |
----------------------------------

このコードのメモリ レイアウト

node head = 631;
node* temp2 = &head;
node** temp3 = &temp2;

現在の例では次のようになります。

ここに画像の説明を入力

アドレスオブと逆参照

これをポインターに関する中途半端な包括的な答えに変えるために、 と を簡単に見てみましょ&*

すでに書いたように、それぞれNameは値/アドレスのペアを表します。

----------------------------------
| | 住所 | | ヴァル | 名前 |
----------------------------------

特定の名前に適用することに&した場合、値/アドレスのペアのアドレスを取得します。つまり:

&temp3 == 0x007

代わりに適用*すると、これは現在の値に対応するアドレスに格納されているもののエイリアスになります。

*temp3意味: "の値に格納されているアドレスに格納されているものは何でも教えてくださいtemp3" したがって、ここには 2 つのステップがあります。

  1. の値に格納されているアドレスを取得しますtemp3
  2. そのアドレスに保存されているものは何でも与える

覚えて:

----------------------------------
| | 住所 | | ヴァル | 名前 |
----------------------------------
| | 0x005 | 0x002 | temp2 |
----------------------------------
| | 0x007 | 0x005 | temp3 |
----------------------------------
  1. の値に格納されているアドレスtemp3」は0x005です。
  2. 「アドレスに格納されているものは何でも」0x005temp2.

したがって

*temp3 == temp2 // temp2 is the dereferenced value of temp3

以来

temp3 == &temp2 // value of temp3 is address of temp2

ご覧のとおり: Dereferencing ( *) は、 address-of の準反対です&

注:*宣言では、ポインターを宣言し、アドレスを逆参照する演算子ではありません。

于 2013-07-23T04:27:27.983 に答える
1

どのポインタもメモリのアドレスを保持し、このアドレスを保持するために (32 ビット システムでは) ほとんど 4 バイトのメモリが必要です。この定義に従って、ポインターへのポインターを次のように定義できます。

pointer to pointer: メモリの別の場所のアドレスを保持する別のメモリ場所のアドレス保持するメモリ内の 4 バイト

ここで、temp2 と temp3 を次のように定義できます。

temp2:オブジェクトのアドレスを保持するメモリ内の場所。node(ほとんどの場合、32 ビット システムのすべてのアドレスには 4 バイトのメモリが必要です)。このアドレスはheadオブジェクト コンテンツと同等です。

temp3node: メモリ内のオブジェクトへのポインタのアドレスを保持するメモリ内の場所。このノードへのnodeポインタはポインタとして定義できます。
したがって、temp3 はヘッド ノードのアドレスのアドレスを保持します。また、head変数の型が単一のアドレス&であるため、変数のアドレスを取得する演算子が必要headです。

于 2013-07-23T03:49:26.793 に答える
1

ポインターは、リストなどのデータ構造のメモリ位置を格納します。ポインタへのポインタは、ポインタのメモリ位置を格納します。リストの先頭を取得するには、追加の逆参照が必要になります。したがって、 no temp2 と temp3 の両方が頭を指しているわけではありません。temp2 は head が指す場所を指し、temp3 は head ポインターのメモリ位置を指します。

于 2013-07-23T03:36:49.830 に答える
0

ポインターは、変数のアドレスを保持する変数です。

次のように宣言できます。

char *a;

そして、次のような変数のアドレスを割り当てることができます:

char b='r';

このような :

a=&b;

ポインターへのポインターは、ポインターのアドレスを保持する変数でもあります (任意の変数のアドレスを保持する変数)。

次のように宣言します。

char **c;

そして、次のaように、ポインタのアドレスを割り当てることができます:

c=&a;

cb のアドレスを含むアドレスが含まれているためa、後で a を使用して逆参照できます。**

この簡単な例によって、これら 2 つのステートメントが何を意味するかを理解できます。幸運を !!

于 2013-07-23T04:13:31.213 に答える
0

できるよ

*temp3 = new_head;

しかし

*temp2 = new_head;

動作しません

関数などに役立ちます

void make_list(Node ** head) {
    *head = malloc(sizeof(Node);
} 
于 2013-07-23T03:37:48.360 に答える