42

iTunes Uのスタンフォード大学のiPhoneコースで手を試していますが、ポインターについて少し混乱しています。最初の課題では、このようなことをしてみました

NSString *processName = [[NSProcessInfo processInfo] processName];
NSInteger *processID = [[NSProcessInfo processInfo] processIdentifier];

エラーが発生しましたが、やみくもにいじった後、問題の原因はNSInteger行の*であることがわかりました。

だから私は明らかに何が起こっているのか理解していません。私はそれがどのように機能すると思うかを説明します、そしておそらく誰かが欠陥を指摘するのに十分親切でしょう。

Web開発とは異なり、私は今、Web開発よりもメモリについて心配する必要があります。したがって、変数を作成すると、どこかに少しのメモリが割り当てられます(私が想定しているRAM)。変数を渡す代わりに、メモリのそのビットへのポインタを渡します。また、ポインタは変数名の前に*を付けることで宣言されます。

私が正しいと仮定すると、NSIntegerに対してそれを行う必要がないのはなぜですか?

4

5 に答える 5

72

NSIntegerはプリミティブ型です。つまり、スタックにローカルに格納できます。アクセスするためにポインタを使用する必要はありませんが、必要に応じて使用できます。この線:

NSInteger *processID = [[NSProcessInfo processInfo] processIdentifier];

アドレスではなく、実際の変数を返します。*これを修正するには、 :を削除する必要があります。

NSInteger processID = [[NSProcessInfo processInfo] processIdentifier];

NSInteger本当に必要な場合は、へのポインタを使用できます。

NSInteger *pointerToProcessID = &processID;

アンパサンドは、オペレーターのアドレスです。ポインタをNSInteger、変数内の整数ではなく、メモリ内の変数のアドレスと同じに設定します。

于 2009-06-18T17:32:46.007 に答える
25

NSIntegerで宣言しない理由*は、オブジェクトではないためです。NSIntegerは、単にintまたはlong:です。

#if __LP64__
typedef long NSInteger;
#else
typedef int NSInteger;
endif

32ビットアプリケーションで使用されている場合は32ビット整数であり、64ビットアプリケーションで構築されている場合は64ビット整数です。

もちろん、ポインタとして渡すこともできNSIntegerますが、ほとんどの関数は、引数をNSIntegerポインタとしてではなく、引数として受け取るだけです。

一方、オブジェクトは、ポインタとして他の関数にのみ渡すことができます。これは、オブジェクトに動的に割り当てられたメモリがあるため、スタックで宣言できないためです。intまたはlongには固定量のメモリが割り当てられているため、これは問題ではありません。

于 2009-06-18T17:32:18.130 に答える
3

*「ポインタ」を意味します。オブジェクト変数はオブジェクトへのポインタを保持しているため、*;があります。NSInteger変数は、NSIntegerへのポインターではなく、NSIntegerを保持するため、。はありません**ポインタ変数に整数を入れているので、その変数にを置くと、少なくとも警告が表示されます。

于 2009-06-18T17:54:59.043 に答える
2

NSIntegerは、int、AFAIKの単なるtypedefです。

于 2009-06-18T17:33:15.380 に答える
0

ポインタの操作

NSInteger integer1 = 1;
NSLog(@"1. integer1:%ld &integer1:%p", integer1, &integer1);
//1. integer1:1 &integer1:0x7ffee59e8a98

NSInteger *integer2 = &integer1;
NSLog(@"2. integer2:%p &integer2:%p *integer2:%ld", integer2, &integer2, *integer2);
//2. integer2:0x7ffee59e8a98 &integer2:0x7ffee59e8a90 *integer2:1

*integer2 = 2;
NSLog(@"3. integer2:%p &integer2:%p *integer2:%ld \t integer1:%ld &integer1:%p", integer2, &integer2, *integer2, integer1, &integer1);
//3. integer2:0x7ffee59e8a98 &integer2:0x7ffee59e8a90 *integer2:2    integer1:2 &integer1:0x7ffee59e8a98
于 2019-05-01T15:35:45.503 に答える