7

私は C でのポインターと参照をよりよく理解しようとしています。私のコースでは、例として次のプログラムを提供しました。

#include <stdio.h>

void swap(int* a, int* b);

int main(void)
{
    int x = 1;
    int y = 2;

    swap(&x, &y);
    printf("x is %i\n", x);
    printf("y is %i\n", y);
}

void swap(int* a, int* b)
{
    int tmp = *a;
    *a = *b;
    *b = tmp;
}

主に & 対 *(逆参照) を使用する必要性に関して、何が起こっているのかをよりよく理解するのに役立つかどうかを確認するために、以下をまとめました。基本的に、int 型へのポインターを宣言する構文 (int* a) と、アスタリスクを使用して「逆参照」する構文 (*a = *b) は、私にとって非常に混乱を招きます。これは、明確にするのに役立つと私が思った上記の別のバージョンですが、実際にはそうではありません:

#include <stdio.h>

void swap(int* a, int* b);

int main(void)
{
    int x = 1;
    int y = 2;
    int *a = &x;
    int *b = &y;

    swap(a, b);
    printf("x is %i\n", x);
    printf("y is %i\n", y);
}

void swap(int* a, int* b)
{
    int tmp = *a;
    *a = *b;
    *b = tmp;
}

要するに、私の質問は、これら 2 つのプログラムが行っていることの間に機能上の違いはありますか? 逆参照 ( ) と演算子 ( )*a = *bの使用の違いは何ですか? 」.&*a = &x

4

4 に答える 4

6

宣言と代入を混同しています。

*a = *bを割り当てと呼びます。タイプ名が含まれていないことに注意してください。

int *a = &x一方、宣言と呼ばれます。x のアドレスでポインターを初期化することに注意してください。ポインターを逆参照していませんが、int へのポインターとして宣言しています。

これを見てください:

int main() {
  int a = 5;
  int b = 2;
  int *c = &a; // c when dereferenced equals 5; **Declaration**
  int *d = &b; // d when dereferenced equals 2; **Declaration**
  int tmp = *c; // tmp equals 5
  *c = *d; // c when dereferenced now equals 2 **Assignment**
  *d = tmp; // d when dereferenced now equals 5 **Assignment**
  return 0;
}

最後に、同じ statementでポインターを宣言して初期化するときは、ポインターを指すようにしたいもののアドレスをポインターに割り当てます。オブジェクトが指す値を変更したい場合は、を使用して逆参照します。一方、それが指すものを変更したい場合は、逆参照しません。*

于 2015-08-11T18:32:27.373 に答える
5

&xx のアドレスを返します。x は整数型で、整数aへのポインター型です。この場合 (*a = &x)、x のアドレスを「整数へのポインタ」型の変数に割り当てていますa。(*a = *b) は、整数である同じ型の 2 つの変数間の代入演算です。とは「整数abのポインター」ですが、その操作では逆参照されるため、これらが指している整数値が読み取られるため、整数と言いました。

あなたが持っていると思う混乱は、 (*a = &x) がポインターの初期化中にのみ意味があるためです。

于 2015-08-11T18:44:31.903 に答える
1

*a = *bsinceaおよびbare ポインター変数を設定すると、*オペレーターはそれを指すメモリ内のセルのを取得し、それを指すセルに配置します。ba

の場合、& 演算子は、変数に割り当てられたセルのアドレス*a = &xを見つけ、それを a が指すセルに配置します。x

于 2015-08-11T18:44:14.620 に答える
-1

要するに、私の質問は、これら 2 つのプログラムが行っていることの間に機能上の違いはありますか?

いいえ、機能的な効果はまったく同じです。の

int *a = &x;
int *b = &y;

swap(a, b); 
// swap(&a, &b) 

の型はaと同じ&a、つまりint*(へのポインタint) です。唯一の違いは、それを保存するために他の変数を使用していることです。これは、論理的には実際には必要ありませんが、特に構文を理解するのに役立つ場合は、それを使用しても問題ありません。

逆参照 (*a = *b) と & の使用 (*a = &x) の違いは何ですか。

*a = *bが指す値に( で取得した) が指すを代入します。もっとはっきり見えるように、b*ba

int tmp = *b;
*a = tmp;

&(*a = &x)アドレスを に格納できないため、有効な式ではありませんint(実際には格納できますが、それは要点を超えています)。

于 2015-08-11T18:50:14.633 に答える