0

ポインタの概念を理解するのに問題があります。以下はコードです。スワップ(&a1、&a2)出力が6、-5ではなく-5、6を出力するのはなぜですか?値はすでにスワップされていますか?

void swap(int *ptr1, int *ptr2){

     int temp;

      temp = *ptr1;
      *ptr1 = *ptr2;
      *ptr2 = temp;

}

int main (int argc, char *argv[]){

    void swap(int *ptr1, int *ptr2);
    int a1 = -5;
    int a2 = 6;
    int *p1 = &a1;
    int *p2 = &a2;

    NSLog(@" a1 = %i, a2 =%i", a1, a2); // out puts: -5, 6

    swap(p1,p2);
    NSLog(@" a1 = %i, a2 =%i", a1, a2); // out puts: 6, -5

    swap(&a1, &a2);
    NSLog(@" a1 = %i, a2 =%i", a1, a2); // out puts: -5, 6
}
4

3 に答える 3

7

swap() への最初の呼び出しで 2 つの値が交換され、2 回目の呼び出しでそれらが元に戻されました。

于 2011-03-08T15:32:30.253 に答える
0

ポインタについての感覚を得るための非常に単純な例...

int i = 2; // i == 2
int *p = &i; // p == 0x00AB (say memory addres of i is 171)
int *q = p;  // q == 0x00AB q and p have the same value

p==qは真です

* p==2は真です

* p ==*qは真です

p = NULL;      // initializes the pointer, which is a good practice
if (*p == 2) { // don't do this as it can cause error or unpredictable results

i == 2は、ポインター変数で何をしたかに関係なく、引き続き真です。

ポインタ変数は、「特別な」整数値を保持していると見なすことができます。メモリアドレスは、通常32ビットの数値です(64ビットアドレスのコンピュータで実行している場合を除く)。

于 2011-03-08T17:28:19.040 に答える
0

毎回同じものを交換しているので(ちょっと)、最初に交換してから元に戻します。a1 は address1 に値 -5 を格納 (アドレスはメモリ内の場所) a2 は address2 に値 6 を格納 p1 は address1 を指している p2 は address2 を指している p1 と p2 を入れ替える ここで、address1 に格納されている項目の値を取得してそれを切り替えるaddress2 のアイテムの値で。したがって、現在、address1 は値 6 を保持し、address2 は値 -5 を保持しています。ここで、p1 と p2 は引き続き同じアドレスを指し、a1 と a2 は同じアドレスから値を返しますが、値は交換されています。&a1 と &a2 のスワッピング &a1 と &a2 のスワッピングは同じことを行います。& はアドレスをポインターとして返し、それを swap 関数に渡します。Swap はポインタを取得し、ポインタが指すアドレスの値を交換します。

基本的に、ポインタはメモリ位置を指します。スワップ関数はメモリ位置を取得し、そこに格納されているデータを交換しますが、それらが指しているメモリ アドレスは変更しません。したがって、どちらの場合も同じアドレスを送信しているため、同じアドレスを場所に 2 回スワップします。

于 2011-03-08T15:46:07.817 に答える