[2076] Re:【C言語ポインタ完全制覇】ポインタはどれだけ進む?
投稿者:knwifuru
2017/12/21 09:00:12
>>この時、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!)
コンパイラが密かに(いえ、きちんと被参照型のサイズを考えて)計算して正しい
値(アドレス)に置き換えてくれてる、ということなのですかね(でしょうね)?