頭と尻尾はくれてやる!

パソコンおやじのiPhoneアプリ・サイト作成・運営日記


変数の"住所"は変えられないの?

変数の"住所"を変えようとしたけどうまくいかなかったって話だよ。

C言語をちゃんと理解している人には当たり前過ぎる内容なんだろうけど、俺はいまいち理解できていなかったので書いておくよ。
俺がなんでダメなの?"Expression is not assignable"ってなんだ?って悩んだ部分を簡素化したのが次の内容なんだよ。
typedef struct {
    int length;
    float array[256];
} ImageInfo;
↑このような構造体を使って
{
    int tempArray[256] = [Hoge getArray];

    ImageInfo imageInfo;
    &imageInfo.array = &tempArray;//---(A)
}
こういうコードを書いたんだ。
最初に仮の配列を用意しといて別クラス(ここではHogeクラス)で超絶ややこしい計算をさせて結果を配列で返してもらってる。
3行目の(A)の処理はその結果を構造体のarrayに入れようとしてるわけだ。気持ちはわかるでしょ?
でもこの(A)の部分に"Expression is not assignable"って出てビルドさえできないんだよ。


そういうもんなの?ってことで確認してみたんだ。
次のコードは整数型でやってみたよ。
{
    int tempNum = 5;
    int num;
    NSLog(@"&num = [%p]",&num);//---(B)
    &num = &tempNum;//---(C)
}
やろうとしているのは整数型のtempNumってのがあってそこになんらかの値(ここでは5だな)が入ってる。それをnumに移してやろうってモノだ。
まあ普通に
num = tempNum;
で済む話なんだけど、"住所"で見る先を変えるという方法でやってみようとしたんだ。
(B)のところでNSLogで"住所"を見るとすでに割り当てられているんだよ。
でも、この住所はどうやら変更できないみたいなんだ。このコードは(C)を指して、"Expression is not assignable"ってことでビルドできない。
&num = ってことで代入できるシロモノではないってことか。
もちろん int* num;って感じで整数型のポインタでやれば"住所"を変えることはできるんだよね。

さもありなんってとこなんだけど、それじゃあ配列はどうよ?
次の同じようなコードは動くのか?って試してみたんだけど、
{
    int tempArray[3] = { 1,2,3 };
    int array[3];
    &array = &tempArray;//---(D)
}
これも同じく(D)が原因で"Expression is not assignable"が出てビルドできないんだ。

そういうことか。
int* や float* のようなポインタ、つまり変数のアドレス(住所)を記憶する変数だと"住所"の変更はできるけど、int や float はポインタではないので"住所"は存在するけど変更できない、って理解しておくことにするよ。

<< iCloudへのバックアップができない   TopPage  EarPodsだと耳から落ちにくくなった >>

コメント


管理者にだけ表示を許可する
 

トラックバック

トラックバックURL
http://ringsbell.blog117.fc2.com/tb.php/680-7651d2b1




Copyright ©頭と尻尾はくれてやる!. Powered by FC2 Blog. Template by eriraha.

FC2Ad