7

皆さんの 99% が「なんてこった…」と思っていることは承知していますが、 を使用するこの概念を理解するのを手伝ってくださいpointers。私の特定の質問は、多くの初心者に役立つと確信しています。

ポインターとは何か、それらはメモリ内のアドレスへの参照であり、(*) 演算子を使用してそのアドレスの値を取得できることを理解しています。

まあ言ってみれば:

int counter = 10;
int *somePointer = &counter;

これで のメモリにアドレスがあり、次のcounterようにしてその値を間接的に指すことができます。

int x = *somePointer;

どちらがx = 10になりますか?

しかし、これは最も基本的な例であり、この場合int x = counter;、その値を使用して取得することができたので、Objective-C や他のいくつかの言語でポインターが本当に重要である理由を説明してください...検出?

感謝します。

4

4 に答える 4

5

Objective-C は C を進化させたものであるため、ポインタを使用しています。Objective-C のようなオブジェクト指向言語でのポインターの利点は、オブジェクトを作成した後、オブジェクト自体を渡す代わりに、オブジェクトへのポインターを渡すことができることです。つまり、大量の記憶領域を占有するオブジェクトがある場合、オブジェクト自体のコピーを渡すよりも、ポインターを渡す方がメモリ効率がはるかに高くなります。s のようなプリミティブ型のみを扱う単純なケースでは、これは目立たないかもしれませんがint、より複雑なオブジェクトを扱い始めると、メモリと時間が大幅に節約されます。

さらに重要なことに、ポインターを使用すると、コードのさまざまな部分が互いにやり取りしやすくなります変数が「参照渡し」ではなく「値渡し」でのみ関数に渡される場合 (これはポインタを使用する場合に発生します)、関数は入力を変更できません。値を返すか、グローバル変数を変更することによってのみ、プログラムの状態を変更できます。これらの変数を使いすぎると、通常、ずさんで整理されていないコードが作成されます。

これが具体的な例です。JSON 文字列を解析して を返す Objective-C メソッドがあるとしますNSDictionary

+ (NSDictionary *)parseJsonString:(NSString *)json
                            error:(NSError **)error;

このメソッドは解析を実行し、NSDictionary問題がなければ を返します。しかし、入力文字列に問題がある場合はどうなるでしょうか? 何が起こったかをユーザー (または少なくともプログラマー) に示す方法が必要なので、NSErrorその情報を含む へのポインターへのポインターを用意します。メソッドが失敗した場合 (おそらく が返される場合nil)、errorパラメーターを逆参照して、何が問題なのかを確認できます。私たちが効果的に行ったことは、メソッドに 2 種類の戻り値を与えることです。通常は を返しますが、 を返すNSDictionaryこともできNSErrorます。

これについてもっと読みたい場合は、「Objective-C のポインター」よりも「C のポインター」を検索したほうがよいかもしれません。もちろん、ポインターは Objective-C で広く使用されていますが、基礎となるすべての機構は C 自体の機構と同じです。

于 2013-02-20T23:13:24.573 に答える
2

ObjectiveC でポインタを使用する最大の利点は何ですか?

最大の利点は、Objective-C をまったく使用できることです。すべての Objective-C オブジェクトはポインターであり、ポインターを使用してアクセスされます (コンパイラーとランタイムでは、オブジェクトを静的に作成することはできません)。それらなしでさらに先に進みます...

于 2013-02-20T23:13:10.760 に答える
1

アイテム:

一連のカウンターを保持するプログラムを作成するように指示した場合、カウンターの数はユーザーがプログラムを開始したときに入力されます。これを、ヒープに割り当てられた整数の配列でコーディングします。

int *counters = malloc(numOfCounters * sizeof(int));

Malloc はメモリを直接操作するため、本質的にポインターを返します。すべての Objective-C オブジェクトは でヒープ割り当てされるmallocため、これらは常にポインターです。

アイテム:

ファイルを読み取り、それが完了したときに別の関数を実行する関数を作成するように言ったらどうなるでしょうか。しかし、この別の機能は不明であり、私が知らない他の人によって追加されることになりました。

このために、「コールバック」があります。次のような関数を記述します。

int ReadAndCallBack(FILE *fileToRead, int numBytes, int whence, void(*callback)(char *));

最後の引数は関数へのポインタです。誰かがあなたが書いた関数を呼び出すとき、彼らは次のようなことをします:

void MyDataFunction(char *dataToProcess);

ReadAndCallBack(myFile, 1024, 0, MyDataFunction);

アイテム:

関数の引数としてポインターを渡すことは、関数から複数の値を返す最も一般的な方法です。OSX 上の Carbon ライブラリでは、ほとんどすべてのライブラリ関数がエラー ステータスを返します。これは、ライブラリ関数がプログラマに役立つものを返さなければならない場合に問題を引き起こします。したがって、関数に情報を返してもらいたいアドレスを渡します...

int size = 0;
int error = GetFileSize(afilePath,&size);

関数呼び出しがエラーを返す場合、それは にあり、エラーがerrorなければ、errorおそらくゼロであり、size必要なものが含まれます。

于 2013-02-20T23:19:42.480 に答える
-1

Objective-C または動的割り当てを使用する言語でのポインターの最大の利点は、ソース コードで作成した名前よりも多くの項目をプログラムで処理できることです。

于 2014-03-22T15:00:59.810 に答える