以下のようなプログラムがあったときに・・・
int vc[5];
printf("&vc[0] = %p\n", &vc[0] );
printf("&vc[1] = %p\n", &vc[1] );
printf("&vc[2] = %p\n", &vc[2] );
printf("&vc[2]-&vc[0] = %p\n", &vc[2]-&vc[0] );
最後のprintfの結果が2と出ます。
&が付くとアドレスを表示すると思うのですが、アドレス同士の引算だと答えは2にはなりませんよね?
これは要素の離れている差を表していると思うのですが、なぜアドレスの減算にならずにこのような結果になるのでしょうか?
またアドレスの差を求める時はどうすればよいのでしょうか?
よろしくお願いします。
No.2ベストアンサー
- 回答日時:
ポインタの演算では、そのポインタの型が加減の単位となります。
下記URLの解説を参照してください。特に「21-7 ポインタを演算する」の
Console.WriteLine( p2-p1 );
ではまさしく同じことをやっています。
http://www.atmarkit.co.jp/fdotnet/csharp_abc2/cs …
なお、アドレスの差を求めるには、
(&vc[2]-&vc[0])*sizeof(int)
で求められるかもしれませんが、処理系に依存します。また、intでなく構造体のポインタの場合、うまくいかない可能性が高いです。詳しくは「アラインメント」で検索してみてください。
No.1
- 回答日時:
> これは要素の離れている差を表していると思うのですが、なぜアドレスの減算にならずにこのような結果になるのでしょうか?
それはアドレスの減算ではなくポインタの減算だからです。
ポインタは単なるアドレスではなく、
int型へのポインタというように型情報も含んでいて、
ポインタ演算は指す型のサイズを考慮して行われます。
(そうでないと、いろいろなところで不便です。)
> またアドレスの差を求める時はどうすればよいのでしょうか?
char *型にキャストするとか、sizeof(int)をかけるとか。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【お題】絵本のタイトル
- ・【大喜利】世界最古のコンビニについて知ってる事を教えてください【投稿~10/10(木)】
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・ハマっている「お菓子」を教えて!
- ・最近、いつ泣きましたか?
- ・夏が終わったと感じる瞬間って、どんな時?
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
セグメントエラー
-
init関数の意味
-
C言語のポインタに直接アドレス...
-
ハンドルはポインタか
-
戻り値で構造体を返すことは可...
-
LPSTR型の初期化について
-
デバイスハンドルとは?
-
VC++6.0 MFC ダイアログバーを...
-
ExcelVBAでのkernel32(64bit)
-
NULLポインタが0でない処理系と...
-
c言語で任意のファイルから読み...
-
[C言語] NULLは必ず0(番地)です...
-
ポインタの結合に関する質問です
-
Run-Time Check Failure #3とい...
-
構造体とfscanf
-
C言語でのconstを返す関数
-
CWnd::EnableWindow()の扱い方
-
基本アルゴリズムの『返す』の...
-
Cで作成したDLL関数をVBから呼...
-
参照型で受け取った引数をポイ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語のポインタに直接アドレス...
-
セグメントエラー
-
init関数の意味
-
fopne で失敗する原因
-
Run-Time Check Failure #3とい...
-
戻り値で構造体を返すことは可...
-
ExcelVBAでのkernel32(64bit)
-
LPSTR型の初期化について
-
参照型で受け取った引数をポイ...
-
C言語でのconstを返す関数
-
ハンドルはポインタか
-
ハンドル、アドレス、ポインタ...
-
PASCALとFARの意味
-
CWnd::EnableWindow()の扱い方
-
ポインタについて
-
デバイスハンドルとは?
-
C言語の文字列?処理 strcpyやl...
-
ポインタのミスでOS壊れるの...
-
C++ vectorのbeginについて
-
基本アルゴリズムの『返す』の...
おすすめ情報