2017-03-03 23 views
0

私は、関数を使用して、特定の変数のアドレスを変更しようとしていますが、私はこれを行う方法を知らない...しかし、これは私の行くです:関数を使用して変数のアドレスを変更するにはどうすればよいですか?

void address (int* x, int* y) 
{ 
    x = y; 
} 

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

    address(&x, &y); 
    printf("%d", x); 

    return 0; 
} 
+3

あなたは何をしたいですか? 'x'と' y'を同じアドレスにしますか? – yano

+0

@yano。変数を移動せずに住所を変更しようとしているようです: –

+2

"住所を変更する"とはどういう意味ですか?アドレスは物理的性質の抽象である。あなたはそれをフレーズとして変更することはあまりありません。もっとはっきりしてください。 –

答えて

2

私はあなたが

をしたい疑います
void address (int* x, int* y) 
{ 
    *x = *y; 
} 

あなたの質問の文言は非常に貧弱ですが。

私が誤解していて、本当に変数のアドレスを変更できると期待している場合は、できません。変数のアドレスは、変更可能な変数に付加された情報ではありません。変数のアドレスはです。それの名前は人間の利便性に過ぎません。

もっと答え

メインで、xとyは0x1234の発言で、int型であり、あなたは、あなたの関数を呼び出す0x1236。 xとyと呼ばれる2つの引数を持つことが起こりますが、これらは実際にmainのxとyとは関連していません。これらの引数はintへのポインタであり、2 intのアドレスを含みます。あなたのケースの幹線道路のxとy。

mains xとy main.xとmain.yを呼び出します。 funcs xとy func.xとfunc.yを呼び出します

func.x = 0x1234とfunc.y = 0x1236です。あなたはこれらを好む今までに何ができる、あなたは今func.xの元の値が失われ、それがfunc.y.の値を持つ

func.x = func.y 

OKをしましたどちらも現在main.yのアドレスを持っています。ファイン、これは単にそれらが異なるもの

このように考え

でポイントになり、main.xのあらゆる側面を変更し、それらが指し示すものは変更されません周り

ジャグリングポインタをmain.yありません。 Cプログラムで

int x 

4バイトの長さの変数を割り当て、私のアドレスを覚えているので、そのアドレスを「x」と呼んでいます。プログラミング(旧旧アセンブラなど)の非常に初期の頃では、など

thing at 0x1234 = 42; 
thing at 0x1236 = thing at 0x1234 + 2; 

を言ってプログラムする必要があります(あなたが実際にあなたには、いくつかのCPUの具体的な指示が、その同じものを持っていた「のことを」言いました) 、これは、その本当に難しい数字だけ

+0

私は私が「地元」ということが X = 0x28ff18 Y = 0x28ff18 がそう、それは動作しますが、いないときの下に時計のウィンドウに表示することができ、...私はデバッグを知っていると機能「アドレス」を入力しないでください私は私の主な機能に戻ります。この変更を私の主な機能に引き継がれたいです。出来ますか? –

+0

@ジョン・デール私は答えをexapnded – pm100

+0

ありがとう、ありがとう、私たちはあなたの例でここでポインタを変更しているだけです? –

2

を持っているコードを読むcosを私は変更しようとしています、あなたが記憶「count_of_mice」または「size_of_planet」の域を呼び出すことができるように、コンパイラの主要な仕事の一つでありますある変数のあるアドレスの関数を使用して

これに対する答えは:できません。コメントに指摘されているように、the address is an abstraction of a physical property。変数はメモリ内の領域を保持し、1つの変数だけが(現在存在するアーキテクチャ上の)特定の領域を占有することができます。

アドレスを保持する2つの変数の値を変更する場合は、変数をポインタとして宣言する必要がありますポインタへのポインタ。例:

void address (int** x, int** y) 
{ 
    *x = *y; 
} 

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

    int *px = &x; // px points to x 
    int *py = &y; // py points to y 

    address(&px, &py); 
    printf("%d", px); 

    return 0; 
} 
+0

ありがとう、これは私が探していたものです! :) –

0

変数のアドレスは、その識別特性の1つです。変数のアドレスを1の値を変更する以上に変更することはできません。

別のアナロジーがあります。私は、紙面に「99 JB Lane」の住所を書き留めてあなたへ。あなたは私の家に行くのに役立つその論文を使うことができます。あなたは、私の家を変えることを選ぶかもしれません。ここで、用紙上の "99"を消して "42"と置き換えたとします。あなたはそのように私の実際の家の番号を変更していないし、そのように私の家と私の隣人の家を同じ家にすることはできません。しかし、 "42 JB Lane"が有効な住所になった場合は、その紙を使ってその家を訪問することができます。

ファンクションaddress()によって受け取られたパラメータ値は、私があなたに与えた伝票のようなものです:2つの変数の値を見つける場所を関数に指示し、それらの値を変更できるようにすることもできますが、値がこれらのアドレスに格納されている変数のIDを変更します。

関連する問題