2

私はCでこのポインター全体と逆参照を理解しようとしています。ほとんど理解できましたが、非常に単純なコードにぶつかったため、理解できません。

char *ptr = "Characters";
char val = *ptr;
char *chrptr = &val;
printf("Value under character pointer is: %p / %c\n", &val, val);
printf("Dereferenced character pointer: %p\n", chrptr);
printf("Array pointer: %p\n", ptr);

さて、実行前に理解したように、、ptr == chrptr == &valしかし実際にはptr != chrptr == &val。どうしてこれなの?

4

7 に答える 7

4
char *ptr = "Characters"; // returns a pointer to 'C'
char val = *ptr; // dereferences the pointer to 'C' and copies 'C' into val

valには独自のメモリ位置があるため、valのアドレスは異なります。

 char *chrptr = &val; //chptr points to val. A different memory location.
于 2012-10-31T15:50:40.117 に答える
2
char *ptr = "Characters";

       +---+---+---+---+---+---+---+---+---+---+----+ 
ptr -> | C | h | a | r | a | c | t | e | r | s | \0 |
       +---+---+---+---+---+---+---+---+---+---+----+ 

char val = *ptr; // you copy 'C' by value from the array, ptr is still pointing 
                 // where it originally pointed

// &val is somewhere else in memory so

char *chrptr = &val;

          +---+ 
chrptr -> | C |
          +---+ 

ptrが指すchrptrポイントが必要な場合は、次のように記述します

char* chrptr = ptr;
于 2012-10-31T16:08:49.963 に答える
1

に割り当てるとchar、コピーが作成されます。したがって、そのコピーのアドレスは元の文字列と等しくなりません。

対照的に、ポインタに割り当てるときは、元の文字列(またはポインタがポインタであるもの)のアドレスを割り当てます。

于 2012-10-31T15:49:47.923 に答える
1
ptr == chrptr == &val

一部だけchrptr == &valが正しいですが、ptr != chrptr。これは、がからの最初の文字のコピーであるためvalです。コピーは元の場所とは別の場所に保存されるため、メモリ内のアドレスが異なります。ptr'C'

于 2012-10-31T15:50:49.363 に答える
0

あなたのコードは次のことをします。

char *ptr = "Characters"; //- Store "Characters" in read only data section and assign the address to variable to `ptr`.

char val = *ptr; //- Assign the value 'C' (i.e 67) to stack variable val.

char *chrptr = &val; //- Assign the address of variable val to chrptr

valこれはスタック変数であるため、そのアドレスはスタックアドレス範囲になります。ただし、文字列リテラルは読み取り専用データセクションに格納されます。そして、ptrだけがそのアドレスを保持します。

つまり、明らかに&val2ptrつの異なるアドレスです。

于 2012-10-31T15:59:00.943 に答える
0

文字列 "Characters" はコンパイラによって 1 つのメモリ領域に配置されますが、変数 "val" ('C' に等しい) は別のメモリ領域に配置されます。これが &val が "ptr" と等しくない理由です。

于 2012-10-31T15:51:52.967 に答える
0

すべての間接変数とローカル変数を気にする必要はありませんが、問題は次のようになります。

int a = 1;
int b = 1;

aとはどちらもb同じ値ですが、明らかに異なるオブジェクトであるため、アドレスが異なります。valとも同様です ptr[0]

于 2012-10-31T15:51:55.050 に答える