0

Cポインターについて学習しようとしていますが、何かを理解できません...次のコード:

#include <stdio.h>

void foo(int *x, int *y);

void foo(int *x, int *y) {
    printf("x = %p\ny = %p\n", &x, &y);
    *x = 5;
    *y = 6;
}

int main(void) {
    int a, b;
    printf("a = %p\nb = %p\n", &a, &b);
    foo(&a, &b);
    return 0;
}

なぜアドレスが違うのですか?最初のprintf(メイン)出力は2つのアドレスです。もう一方printf(foo)は異なるアドレスを出力します。foo(&演算子)にアドレスを渡します。

4

9 に答える 9

8

ではmainと のアドレスを出力していますが、ではxとへのポインターのアドレスを出力しています。あなたが書くつもりだった:yfooxy

printf("x = %p\ny = %p\n", x, y);

&xとの欠如に注意してくださいy

于 2010-09-28T16:54:03.480 に答える
3

printf("x = %p\ny = %p\n", &x, &y);x と y の値ではなくアドレスを出力するためです。あなたはそれを置き換える必要があります

printf("x = %p\ny = %p\n", x, y);

同じ結果が得られます。

于 2010-09-28T16:53:27.127 に答える
3

foo 関数は int へのポインターをパラメーターとして受け取ります。つまり、x と y は既に foo のポインターであり、それらの値は出力するアドレスです。

代わりに、これらのポインターのアドレスを出力します。あなたのプリントはより似ているはずです

printf("x = %p\ny = %p\n", x, y);
于 2010-09-28T16:53:51.807 に答える
3

printf呼び出しにfooは、ポインタのアドレス、つまり 型の変数が渡されていますint **&呼び出しからシンボルを削除すると、 の呼び出しprintfと同じアドレスが得られるはずです。printfmain

于 2010-09-28T16:54:20.823 に答える
2

まず、あなたのCについて:

main()の上で関数全体を定義している場合は、その前にプロトタイプを含める必要はありません。したがって、2行目を削除します。

void foo(int *x, int *y);

さて、目前の実際の問題については、疑似メモリマップが便利です。

    a      b
 --------------
|  5   |   6   | <- data
 --------------
 [1000]  [1004]  <- address

    x        y
 ----------------
|  1000  | 1004  | <- data
 ----------------
  [2000]   [2004]  <- address

だからここで、あなたは得るでしょう:

a = 1000 b = 1004  (the addresses of a & b)
x = 2000 y = 2004  (the addresses of x & y)

お望みならば:

x = 1000 y = 1004

タイプ、

printf("x = %p\ny = %p\n", x, y);

上記のメモリマップから明らかなように。

于 2010-09-28T17:04:43.280 に答える
1

主に、ローカル変数aとのアドレスを出力していますb。ここではfoo、ローカル変数のアドレスを出力していますが、ローカル変数xy保持されているアドレスは出力していません。それらを一致させたい場合は、ドロップ&インする必要があります。foo

ポインタはメモリアドレスを保持する変数であることに注意してください。ポインタ変数のアドレスとポインタに保持されているアドレスを混同しています。2つの印刷を一致させたい場合は、ポインターが保持するものを印刷する必要があります。

于 2010-09-28T16:55:30.807 に答える
1

メインでは、a & b 変数のアドレスを出力していますが、関数 foo() では、x & y へのポインターのアドレスを出力しています。

于 2015-08-13T07:59:47.960 に答える
0

main()の最初printfの行には、メインのaおよびのアドレスが表示されますb

fooはとprintfのアドレスを表示します。xy

あなたが望むのは、との main() からのアドレスを表示することだと思いaますb

変更:

  printf("x = %p\ny = %p\n", x, y);

main() からのアドレスを表示する

于 2010-09-28T16:55:00.010 に答える
0

main では、変数 a と b のアドレスが出力されます。関数 foo() では、ポインター x と y のドレスが出力されます。これらは変数と b を指しています。

于 2020-05-11T03:01:42.737 に答える