0

なぜこのコードが機能するのか、私は非常に混乱しています。ポインターは何かのアドレスを保持する「カプセル」であると教えられました。したがって、swapnum関数は、int の実際のアドレスではなく、これらの「カプセル」の 1 つを期待する必要があります。一時的なポインタを作成してそのアドレスに設定していますか? その場合、次のような参照によってポインターを渡すとどうなりますint * c = &a; swapnum (&c...か?

#include <stdio.h>

void swapnum(int *i, int *j) {
  int temp = *i;
  *i = *j;
  *j = temp;
}

int main(void) {
  int a = 10;
  int b = 20;

  swapnum(&a, &b);
  printf("A is %d and B is %d\n", a, b);
  return 0;
}
4

6 に答える 6

3

pointer住所の別の言葉です。それについて本当に魔法は何もありません。それは数値を含む単なる変数であり、その数値はそれが指すもののメモリアドレスです。

あなたの例では、メモリは次のようになります。

0x00001004 - 10         # a
0x00001008 - 20         # b
0x0000100C - 0x0001004  # i
0x00001010 - 0x0001008  # j
0x00001014 - 00         # temp

ijは両方ともint*、整数を含むアドレスが含まれていることを意味します。コード*iは、「のアドレスにある値を返し、iそれがint.

したがって、あなたの を見ると、次swapnumのようになります。

int temp = *i;
# take the value at 0x0001004 (10) and place it in 0x00001014

*i = *j;
# place the value at 0x0001008 (20) and place it in 0x00001004

*j = temp;
# place the value at 0x0001014 (10) and place it in 0x0001008

その後、メモリは次のようになります。

0x00001004 - 20         # a
0x00001008 - 10         # b
0x0000100C - 0x0001004  # i
0x00001010 - 0x0001008  # j
0x00001014 - 10         # temp

あなたは確かにこれを行うことができます:

int* c = &a;
swapnum(c, &b);

あなたがしているのは、 のアドレスを取得し、それaを入れてから、アドレスを期待する にc渡すことだけです。swapnumポインタは単なるアドレスです。

于 2012-10-13T22:09:42.390 に答える
2

オブジェクトのアドレスはオブジェクトのポインタです! ポインターについては、これですべてです。実際には、ポインターはオブジェクトが存在するアドレスになります。オブジェクトの代わりにアドレスを使用することの要点は、アドレスを使用すると同じオブジェクトを持つことです。

于 2012-10-13T22:02:23.867 に答える
1

&aa'sメモリ内のアドレスとして評価される式です。この値は、ポインター型の変数に格納する必要があります。例えば:

int* i = &a;

ここで、は、割り当てられた値のコンテナ (カプセル) として機能するi型の変数です。ただし、このカプセルは値自体int pointerを保持しません。a値を保持し&aます。また、カプセルであることは、一般的に変数であることの直接的な結果です。必ずしもpointer型の変数であるためではありません。

さて、この声明:

swapnum(&a, &b);

引数をいくつかのローカル変数にコピーするという非常に通常の仕事を行います - 通常の値渡し関数呼び出しです。この場合、実際に起こることは、&a値、つまりa'sアドレスをローカル変数にコピーすることです。iもちろん、これは type で定義する必要がありますint pointer

定義した場合:

int * c = &a; 

そして、次のように呼び出します。

swapnum (&c...

cタイプの変数になるため、それは機能しませんint pointer&c、その場合、そのような変数のアドレスになります。iしたがって、このアドレスを含むローカル変数の型は、そのような型の値のコンテナーとして定義されている必要があります。int pointerつまり、またはのアドレスへのポインタ型の変数として定義されている必要があります。int **

関数を適切に変更せずにこのような関数呼び出しを行うと、確実にコンパイラ時間エラーが発生します。

于 2012-10-13T22:19:57.710 に答える
1

&itemへのポインタを返しますitem

また、私が知っているすべての最新のアーキテクチャでは、ポインターは単にアイテムのアドレスです。

ポインターへのポインターを作成して swapnum に渡すと、次の 2 つのいずれかが発生します。

  1. ポインターが intではなく int * 型であるため、コンパイラーは文句を言います
  2. ポインターの値を交換します。少なくともポインタが整数と同じサイズである場合
于 2012-10-13T22:00:30.400 に答える
1

では、 address-ofmain演算子を使用して と のアドレスに渡しています。 &swapnumab

ポインタの値は実際にアドレスです。「カプセル」は一切ありません!(おそらく、カプセルのない単純なアドレスと考える方が簡単です!)。

もしそうなら、の代わりにint *c = &ac を渡すことができ、それは問題なく動作します。関数が. _swapnum()&a&cint **int *

于 2012-10-13T22:07:20.930 に答える
0

C++ は静的に型付けされた言語です。これは、すべての式がコンパイル時に既知の特定の型を 1 つ持つことを意味します。C++ 標準では、式 expr が組み込み型 T の場合、式 &expr は T* (T へのポインター) 型であることがわかります。それで全部です...

于 2012-10-13T22:06:29.220 に答える