• ベストアンサー

ポインタについてです

ポインタのアドレスを調べる実験をしました。 ファイル名はbenkyou.c int main(int argc, char *argv[]) { ・・・・ } コンパイルしてbenkyou.exeとし、MS-DOSコマンドプロンプトで benkyou zyxwv とコマンド。 その結果、主な各変数自身のアドレスが、 argv = 00430EA0 (この中には430EACが格納されている (以下、全てのアドレスの先頭2桁00を省略します *argv = argv[0] = 430EAC (この中には000062が格納されている *(argv+1) = argv[1] = 430EAB (この中には000062が格納 **argv = 000062 *(argv[0]+0)=000062 (この中には'b'が格納されている *(argv[0]+1)=000065 (この中には'e'が格納されている *(argv[0]+2)=00006E (この中には'n'が格納されている *(argv[1]+0)=00002A (この中には'z'が格納されている *(argv[1]+1)=000079 (この中には'y'が格納されている *(argv[1]+2)=00007A (この中には'x'が格納されている という結果になりました。 ここで不思議に思っているのは、*(argv[1]+0)、*(argv[1]+1)、・・・ 等のアドレス値の差がバラバラなことです。 自分が読んだ書籍などでは、この値は等間隔だと書いてあったような・・。char なら1バイトだから、おなじ配列ならばアドレス値は1ずつ増えると習った気がします。 バラバラにもなりうるのですか? 私の勘違いかもしれません。 混乱気味なので分かりやすく説明していただきたいです。 今回使ったコンパイラは Visual C++ です。

質問者が選んだベストアンサー

  • ベストアンサー
  • kary
  • ベストアンサー率55% (10/18)
回答No.1

62(b)や65(e)ですが、これはasciiコードを表していて、つまりアドレスに格納されている文字そのものを指しているのではないでしょうか。ただ、zは0x7A、xは0x78だと思うのでちょっと違うのかもしれません。お手元にコード表があれば確認してください。また、アドレスを表すなら、argv[0]+1等で*は必要ないのではないでしょうか。間違っていたらごめんなさい。

rousei
質問者

お礼

おっしゃる通りでしたm(_ _)m 恥ずかしい・・ またよろしくお願いします。

その他の回答 (1)

  • gatyan
  • ベストアンサー率41% (160/385)
回答No.2

#include <stdio.h> void main(int argc,char *argv[]) { printf("0番目 引数 %s\n",argv[0]); printf("0番目 引数1文字目のアドレス %p\n",argv[0]+0); printf("0番目 引数2文字目のアドレス %p\n",argv[0]+1); printf("0番目 引数1文字目のアドレス %p\n",&(argv[0][0])); printf("0番目 引数2文字目のアドレス %p\n",&(argv[0][1])); printf("1番目 引数 %s\n",argv[1]); printf("1番目 引数1文字目のアドレス %p\n",argv[1]+0); printf("1番目 引数2文字目のアドレス %p\n",argv[1]+1); printf("1番目 引数1文字目のアドレス %p\n",&(argv[1][0])); printf("1番目 引数2文字目のアドレス %p\n",&(argv[1][1])); } それぞれの 1文字目,2文字目のアドレスに一緒の値が表示されませんか?

関連するQ&A

専門家に質問してみよう