-1

以下のコードの 6、7、8 行目に興味があります。

#include <stdio.h>
#include <stdlib.h>

void go_south_east(int *lat, int *lon) {
  printf("Lat: %p, Long: %p\n", lat, lon);
  printf("Address of Lat: %p, Address of Long: %p\n", &lat, &lon);
  printf("Address of Lat: %p, Address of Long + 8 bytes?: %p\n", &lat, &lon+8);
  printf("Size of Lat: %lu, Size of Long: %lu\n", sizeof(lat), sizeof(lon));
  *lat -= 1;
  *lon += 1;
}

int main() {

  int latitude = 32;
  int longtitude = -64;
  go_south_east(&latitude, &longtitude);
  printf("Avast! Now at: [%i, %i]\n", latitude, longtitude);

  return 0;
}

私が得た出力は次のとおりです。

Address of Lat: 0x7fff5fbfe9e8, Address of Long: 0x7fff5fbfe9e0
Address of Lat: 0x7fff5fbfe9e8, Address of Long + 8 bytes?: 0x7fff5fbfea20 
Size of Lat: 8, Size of Long: 8

lat および long ポインターのサイズは、long unsigned int であるため、8 バイトであることを理解しています。しかし、メモリ内で互いに 1 バイトしか離れていないのはなぜですか? サイズが8バイトなので、互いに8バイト離れているべきではありませんか? ご意見をお聞かせください。


有益なアドバイスをありがとう。みんなを回答としてマークできたらいいのにと思いましたが、できません。心から感謝する。

4

4 に答える 4

2

あなたの質問には、まったく異なるものと説明のつかない主張が混在しています。

long unsigned intまず、コードにポインターが表示されません。コード内のすべてのポインターにはint *型があります。どこlong unsigned intから来たの?

次に、latlonはデータ ポインタです。通常、非エキゾチックな C 実装では、すべてのデータ ポインターのサイズは同じです。彼らが何を指しているのかは問題ではありません。お使いのプラットフォームでは、データ ポインターのサイズは 8 バイトです。つまり、へcharのポインターとポインターdoubleとポインターunsigned long intは同じ 8 バイト サイズになります。

第三に、それらがメモリ内で 1 バイト離れているという考えはどこから得たのですか? 出力の最初の行は、それらが0x7fff5fbfe9e8および0x7fff5fbfe9e0アドレスにあることを明確に示しています。これらのアドレスは正確に 8 バイト離れています。0x7fff5fbfe9e8マイナス0x7fff5fbfe9e0は 8 です。では、「1 バイト離れた」はどこから来たのでしょうか?

&lon+8第四に、あなたのコードは、アドレスを「8バイト」だけ変更することを示唆しているようです。これは正しくありません。データ ポインターに 1 を追加すると、データ ポインターがバイト単位でT*シフトされsizeof(T)ます。つまり、&lon+8実際にはアドレスが 8*8=64 バイト変化します。これは、まさに出力で観察されるものです。0x7fff5fbfea20マイナス0x7fff5fbfe9e0は 64 に相当します。

基本的に、あなたが尋ねる質問は、出力で観察したものと直接矛盾しています。それはちょっと答えるのが事実上不可能になるようなものです。人に赤いハンカチを見せて、なぜ緑なのかと尋ねるようなものです。

于 2012-09-11T17:19:35.113 に答える
0

ポインタ演算は、実際にはデータ型のサイズをアドレスに追加します。明確にするために:

int* i = 0;
i++;
printf("%p\n", i); // Prints 0x4, not 0x1

それで

printf("Address of Lat: %p, Address of Long + 8 bytes?: %p\n", &lat, &lon+8);

実際には、lon + 8 * sizeof(&lon)バイトのアドレスを出力します

于 2012-09-11T17:02:22.337 に答える
0

これら 2 つのアドレスの差はちょうど 8 です。もう一度見てください。

于 2012-09-11T16:41:20.263 に答える
0

それらは互いに 8 バイト離れています。PC はビット アドレスではなくバイトアドレスです。

つまり、番号付けされたメモリ単位はバイトです。

于 2012-09-11T16:41:59.257 に答える