0

Objective-C を学ぶために本を読んでいますが、このプログラムはポインターを扱う上で重要な概念を示していると思われますが、本当に迷っています。

p1関数の引数で、p2&il、およびをポインター&i2の値 ( )に変換する何らかの変換が行われていますか? *のようp1*p1?

実際の変数ではなく、変数のコピーが関数に渡されたと思いましたが、渡された変数の値が関数の後で変更されたのはなぜですか?

また、3行目に次のような警告が表示されるのはなぜNo previous prototype for function 'exchangeValues'ですか?

ありがとうございました!!

#import <Foundation/Foundation.h>

void exchangeValues (int *pint1, int *pint2) {
    int temp;

    temp = *pint1;
    *pint1 = *pint2;
    *pint2 = temp;
}

int main (int argc, char *argv[]) {
    @autoreleasepool {
        void exchangeValues (int *pint1, int *pint2);
        int il = -5, i2 = 66, *p1 = &il, *p2 = &i2;

        NSLog(@"il = %i, i2 = %i", il, i2);

        exchangeValues(p1, p2);
        NSLog(@"il = %i, i2 = %i", il, i2);

        exchangeValues(&il, &i2);
        NSLog(@"il = %i, i2 = %i", il, i2);
    }
    return 0;
}

出力:

2012-08-02 11:13:38.569 Test[381:707] il = -5, i2 = 66
2012-08-02 11:13:38.571 Test[381:707] il = 66, i2 = -5
2012-08-02 11:13:38.572 Test[381:707] il = -5, i2 = 66
4

4 に答える 4

2

あなたがポインタについて教えられているなら、それは複雑な例だと思います!

p1、p2、&il、および&i2をポインターの値(*)に変換する関数の引数で、ある種の変換が発生していますか?p1が*p1に変わるように?

p1およびは(ポインタ)p2として宣言され、および(演算子を使用)のアドレスで初期化されます 。int *inti1i2&

変数のコピーが実際の変数ではなく関数に渡されたと思ったのに、渡された変数の値が関数の後で変更されたのはなぜですか?

変数のコピーが関数に渡されますが、この場合はタイプの変数int *(へのポインターint)です。値が変更される理由は、exchangeValues()関数がそれらのポインターを逆参照し、値を交換しているためです。これは、関数からの戻り値として割り当てられている変数を除いて、関数が自身のスコープ外の変数を変更できる唯一の方法です(C / Objective-Cの場合)。

また、3行目に次のような警告が表示されるのはなぜですか。関数「exchangeValues」の以前のプロトタイプはありませんか?

入力を間違えたようです。以下の行を削除して@autoreleasepoolください:

@autoreleasepool {
    void exchangeValues (int *pint1, int *pint2);   <-- delete this line
于 2012-08-02T15:40:18.827 に答える
1

関数にポインターを渡すと、実際にはそのポインターのコピーが渡されますが、それでもメモリ内の同じアドレスを参照します。したがって、そのポインターを逆参照しても、関数スコープ外の変数を指します。

于 2012-08-02T15:39:38.923 に答える
1

実際の変数ではなく、変数のコピーが関数に渡されたと思いましたが、渡された変数の値が関数の後で変更されたのはなぜですか?

ここでは、ポインターのコピーが関数に渡されます。したがって、関数が持っているものは、変数が格納されてl1いるメモリ位置を指しています。l2そう

void exchangeValues (int *pint1, int *pint2) {
    int temp;

    temp = *pint1;   // store the value that pint1 points to in temp
    *pint1 = *pint2; // store the value pint2 points to where pint1 points to
    *pint2 = temp;   // store the value saved in temp where pint2 points to
}
于 2012-08-02T15:39:54.350 に答える
0

変数がどのように宣言され、すべてがそのように連続して初期化されるかは少し混乱しますが、基本的には次のとおりです。

i1intセットですのアドレス-5 p1へのセットへのポインタですinti1

i2とについても同じことが言えますp2

変換は行われません。これらのポインターが関数で指す値を効果的に「交換」しています。

ポインタは紛らわしいものですが、それに固執すると、このような十分なパーツとサンプルコードで明らかになります...

于 2012-08-02T15:39:43.117 に答える