3

私が理解しているように、ポインタには別のメモリ位置にあるデータのアドレスが含まれていますか?
アプリの実行中、ポインタの位置はどのように追跡されますか? なぜポインターを追跡する必要があるのですか? ポインターが保持するアドレスを直接追跡しないのはなぜですか?

さらに、次のコードがある場合:

NSString *string = @"hello";
string = @"bye";

string名前付きのポインター(名前付きのポインターですか、それとも NSString オブジェクトですか?) に格納されている値stringを、新しい文字列 (「さようなら」) のアドレスに変更していますよね?
では、ポインタが保持するアドレスに格納されているオブジェクトを直接変更するにはどうすればよいでしょうか?

(また、「追跡する」を使用した場合に使用する正しい用語は何ですか?)

ありがとう

4

3 に答える 3

7

なぜポインタを追跡するのが面倒なのか、ポインタが保持するアドレスを直接追跡しないのはなぜですか?

Objective Cのオブジェクト参照は実際にはポインタであるため、オブジェクト(などNSString)を使用するたびに、そのオブジェクトへのポインタを使用します-(NSString *

stringという名前のポインタ(stringという名前のポインタまたはNSStringオブジェクトですか?)に格納されている値を、新しい文字列のアドレス( "bye")に変更しています。

右。

では、ポインタが保持しているアドレスに格納されているオブジェクトを直接変更するにはどうすればよいでしょうか。

このような文字列の場合、それらは不変であり、変更することはできません。他のオブジェクトの場合、それらのメソッドを呼び出すか、それらのプロパティを設定します。

于 2012-04-29T00:14:31.200 に答える
3

アプリの実行中、ポインタの位置はどのように追跡されますか?

ポインタは他の変数として保存されます。通常は と同じサイズにunsigned longなりますが、実装方法を理解するためだけに、これが保証されるわけではありません。コンパイラは多種多様な最適化を自由に行うことができるため、ポインタはメモリに格納されたり、レジスタに格納されたり、最適化された場合に仮想エンティティとしてのみ存在したりする可能性があります。

次のコードを検討してください。

void foo(void) {
    char *c;
    char buf[100];
    for (c=buf; c < buf+100; c++ {
        c = '0';
    }
}

この場合、変数は、配列内のすべての文字にcASCII 文字を書き込むために使用されています。この関数を超えて存在しないため、レジスタにのみ存在する可能性があります。(このコードを記述するより良い方法があります。)0bufc

次のコードを検討してください。

struct foo {
    char name[10];
    struct foo *next;
}

この場合のメンバnextは、さらに別のオブジェクトへのポインタstruct fooです。たとえば、これらのもののリンク リストです。これらのポインターは、これらのオブジェクトのコントラクトの一部であるため、メモリに格納する必要があります。つまり、そこに存在する必要があります。これらのポインターを回避する方法もありません。ポインターが指すオブジェクトは、プログラマーの気まぐれで他のオブジェクトに置き換えることができます。また、これらのオブジェクトの数は実行時に完全に決定されるため、コンパイラは、スタックに割り当てられた変数の場合のように、シンボル テーブル内のアドレスを追跡することはできません。

では、ポインタが保持するアドレスに格納されているオブジェクトを直接変更するにはどうすればよいでしょうか?

これは、コードでの例の文字列の使用によって複雑"foo"になります。これらはプロセス アドレス空間の読み取り専用メモリに保存されるため、変更することはできません。(驚き!) 別のメソッドで文字列を初期化すると、ポインターを介してデータを変更できます。

char *c = malloc(10);
strcpy(c, "hello");
c[0] = 'H';
printf("c: %s\n", c);

これにより、ポインターを介して使用可能な割り当てられたスペースにhwithが上書きされます。ポインターを配列であるかのようにアクセスすることは、ポインター アクセスを次のように書き直すことと同じです。Hc

c[0] = 'f';
c+0 = 'f';

実際、配列へのアクセスはよく似ています。配列の名前は、最初の要素へのポインタと同じです。

少し複雑です。Expert C Programmingという本は、ポインタを驚くほど詳細にカバーしており、お金を払うだけの価値があります。

于 2012-04-29T00:59:33.443 に答える
0

Q : では、ポインタが保持するアドレスに格納されているオブジェクトを直接変更するにはどうすればよいですか?

回答:文字列ポインタが指すメモリ位置の内容を変更したい場合は、NSMutableStringの使用を開始してください。

NSString は不変型です。つまり、コンテンツを変更することはできませんが、ポインターを別の場所に向けることはできます。あなたの場合、「こんにちは」から「さようなら」。

于 2012-12-13T09:02:11.883 に答える