K.Maebashi's BBS

ご自由に書き込んでください。雑談も可。
テスト書き込みの類はテスト用掲示板にどうぞ

[日付順表示] [日付順インデックス] [スレッド順インデックス]


新規投稿 | 開設者ホームページへ戻る | ヘルプ


[2076] Re:【C言語ポインタ完全制覇】ポインタはどれだけ進む?
返信


投稿者:knwifuru
2017/12/21 09:00:12

Link:
>>この時、ip はポインタ(型の変数)ですよね? ですから、ip+2、すなわち、
>>ポインタ(型の変数の値)に2加算したポインタ『値』は、あくまで2しか増えて
>>いないじゃない!、と僕は思ったわけです。
>
>うーん、『「ポインタ型の値」は、実際にはメモリのアドレスのことです』と
>p.43には書いてあるわけで、その意味では一貫していると思うのですが……
>
>ip+1としたとき、それはもちろん配列の添字として考えれば1しか増えてないですし、
>引き算すれば1になりますが、図を描いて矢印が動く距離を見てみれば、
>「そのポインタが指す型のサイズ分だけ」動いている、と思うのですが。

僕の混乱の原因は、ここにありまして…

List 1-4array2.c を、ちょっとだけ変更した次のもの

#include <stdio.h>

int main(void)
{
  int array[5];
  int *p;
  int *p0=&array[0], *p1=&array[1];
  int i;

  /* 配列arrayに値を設定 */
  for (i = 0; i < 5; i++) {
    array[i] = i;
  }

  /* その内容を表示 */
  for (p = &array[0]; p != &array[5]; p++) {
    printf("%d %p\n", *p, p);
  }

  printf("p1-p0: %d, %p\n", p1-p0, p1-p0);

  return 0;
}

を走らせた結果は

0 0x7ffc25766960
1 0x7ffc25766964
2 0x7ffc25766968
3 0x7ffc2576696c
4 0x7ffc25766970
p1-p0: 1, 0x1

となり、『pには1しか足していないのに(p+=1としても当然同じ)、それを表示
させるとなぜ4ずつ増えている? どこにマジックがある?』という当惑です。
(1足した筈なのに、4増えちゃった? でも、p1とp0の差は、あくまで、1!)

コンパイラが密かに(いえ、きちんと被参照型のサイズを考えて)計算して正しい
値(アドレス)に置き換えてくれてる、ということなのですかね(でしょうね)?
[ この投稿を含むスレッドを表示] [ この投稿を削除]



[ より新しい投稿] [ より古い投稿]