K.Maebashi's BBS

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

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


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


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


投稿者:knwifuru
2017/12/19 08:28:55

Link:
2-3-2ポインタ型派生で(第1版p151、第2版p172)、「くどいようですが繰り返しておきます。ポインタに対して加算を行うと、そのポインタの指す型のサイズだけ、ポインタが進むのでした。」とありますが、ポインタの指す型のサイズだけ進むのは、(通常のポインタの実装では)【アドレス】であって、ポインタが進む大きさは、ポインタに加算した量だけ、ではないでしょうか?
[ この投稿を含むスレッドを表示] [ この投稿を削除]



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


投稿者:knwifuru
2017/12/19 23:07:31

Link:
ついでに申せば、第1版のFig.3-3の「1加算するとここを指す」という説明も、よくわかりません。どういう意味でしょうか?何に1加算すると?

>2-3-2ポインタ型派生で(第1版p151、第2版p172)、「くどいようですが繰り返しておきます。ポインタに対して加算を行うと、そのポインタの指す型のサイズだけ、ポインタが進むのでした。」とありますが、ポインタの指す型のサイズだけ進むのは、(通常のポインタの実装では)【アドレス】であって、ポインタが進む大きさは、ポインタに加算した量だけ、ではないでしょうか?
[ この投稿を含むスレッドを表示] [ この投稿を削除]



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


投稿者:(ぱ)こと管理人
2017/12/20 00:23:07

Link:
>2-3-2ポインタ型派生で(第1版p151、第2版p172)、「くどいようですが繰り返して
>おきます。ポインタに対して加算を行うと、そのポインタの指す型のサイズだけ、
>ポインタが進むのでした。」とありますが、ポインタの指す型のサイズだけ進むのは、
>(通常のポインタの実装では)【アドレス】であって、ポインタが進む大きさは、
>ポインタに加算した量だけ、ではないでしょうか?

この「ポインタが〇〇だけ進む」という表現は、第2版p.56の

>ポインタって、要するにアドレスのことなんだろ?
>だったら、1足したら1進むに決まってるじゃないか!

のところから一貫して「バイト数」を指しているつもりです。

私だって普通にポインタ演算(まあめったに使いませんが)でintの配列の
次の要素を指す時には、「4バイト先」なんてことを意識したりはしませんが、
この本では、「そのポインタの指す型のサイズだけ、ポインタが進む」ということを
強く意識しないと、たとえばp.195の

「ポインタにi加算することは、そのポインタが指す型のサイズ×iだけ、
ポインタを進めることを意味する。hogeの指す先の型は「intの配列(要
素数5)」であるから、hoge + iでは、sizeof(int[5]) * iだけ進む。」

という説明が意味不明になってしまうのではないでしょうか。
そして、こういう説明が必要だと思ったからこそ、私はこの本を書いたわけです。
[ この投稿を含むスレッドを表示] [ この投稿を削除]



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


投稿者:(ぱ)こと管理人
2017/12/20 00:26:09

Link:
>ついでに申せば、第1版のFig.3-3の「1加算するとここを指す」という説明も、
>よくわかりません。どういう意味でしょうか?何に1加算すると?

この図中にある「Tへのポインタ」に1加算すると、です。
[ この投稿を含むスレッドを表示] [ この投稿を削除]



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


投稿者:knwifuru
2017/12/20 07:51:18

Link:
>>ついでに申せば、第1版のFig.3-3の「1加算するとここを指す」という説明も、
>>よくわかりません。どういう意味でしょうか?何に1加算すると?
>
>この図中にある「Tへのポインタ」に1加算すると、です。

あ、配列へのポインタの説明のFig.3-6と見比べて、わかりました。

これ、あるオブジェクトがぽつんとある図ではなく、メモリ空間内で図の上から下にアドレスが大きくなっていっていて、「Tへのポインタ」が「派生元の型T」のとある変数?の場所の手前を指していて、「Tへのポインタ」に「1加算するとここ(「派生元の型T」のとある変数?の場所の次)を指す」、という意味なのですね!

理解しました。
[ この投稿を含むスレッドを表示] [ この投稿を削除]



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


投稿者:knwifuru
2017/12/20 08:08:58

Link:
>>2-3-2ポインタ型派生で(第1版p151、第2版p172)、「くどいようですが繰り返して
>>おきます。ポインタに対して加算を行うと、そのポインタの指す型のサイズだけ、
>>ポインタが進むのでした。」とありますが、ポインタの指す型のサイズだけ進むのは、
>>(通常のポインタの実装では)【アドレス】であって、ポインタが進む大きさは、
>>ポインタに加算した量だけ、ではないでしょうか?
>
>この「ポインタが〇〇だけ進む」という表現は、第2版p.56の
>
>>ポインタって、要するにアドレスのことなんだろ?
>>だったら、1足したら1進むに決まってるじゃないか!
>
>のところから一貫して「バイト数」を指しているつもりです。

(略)

>そして、こういう説明が必要だと思ったからこそ、私はこの本を書いたわけです。

有難うございます。感謝しながら読ませて頂いております。

混乱してきました。あ、勿論、ポインタの指す先がどれだけ進むか?は、理解しているつもりです。

  int i, iarray[10];
  int *ip;

  ip = iarray

で int が 4bytes である場合に、

  *(ip+2);

が、iarray の先頭アドレスから 4*2=8bytes を参照していることはわかっているつもりです。
この時、ip はポインタ(型の変数)ですよね? ですから、ip+2、すなわち、ポインタ(型の変数の値)に2加算したポインタ『値』は、あくまで2しか増えていないじゃない!、と僕は思ったわけです。そして、「ポインタが〇〇だけ進む」という表現は、『ポインタ「の値」が〇〇だけ進む』と読めました。その指す先は、勿論、8bytes 進んだ場所ですが… (ipとip+2の差はあくまで2ですが、ip+2がdereferenceする先とipがdereferenceする先の番地の差は、2*sizeof(int)、で、バイト数で考えて意味をもつのは、あくまでdereferenceする先では?)

…というわけで、『ポインタ「の指し示すアドレス」が〇〇だけ進む』などという表現の方が、くどい文章になるけれど、誤解する僕のようなバカチンは減るのでは?と申したわけです。

細かくてすみません…
[ この投稿を含むスレッドを表示] [ この投稿を削除]



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


投稿者:(ぱ)こと管理人
2017/12/21 00:59:23

Link:
>この時、ip はポインタ(型の変数)ですよね? ですから、ip+2、すなわち、
>ポインタ(型の変数の値)に2加算したポインタ『値』は、あくまで2しか増えて
>いないじゃない!、と僕は思ったわけです。

うーん、『「ポインタ型の値」は、実際にはメモリのアドレスのことです』と
p.43には書いてあるわけで、その意味では一貫していると思うのですが……

ip+1としたとき、それはもちろん配列の添字として考えれば1しか増えてないですし、
引き算すれば1になりますが、図を描いて矢印が動く距離を見てみれば、
「そのポインタが指す型のサイズ分だけ」動いている、と思うのですが。

>…というわけで、『ポインタ「の指し示すアドレス」が〇〇だけ進む』などという

『ポインタ「の指し示すアドレス」』だと、ポインタの指す先にあるアドレスが
増えるという意味にとられそうな気もしますけど、
まあ、「ポインタが〇〇だけ進む」と書くよりは、「ポインタが〇〇バイトだけ進む」と
単位を明示した方が、誤解を招かなかったかもしれませんね。
[ この投稿を含むスレッドを表示] [ この投稿を削除]



[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!)

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



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


投稿者:(ぱ)こと管理人
2017/12/22 01:07:55

Link:
>コンパイラが密かに(いえ、きちんと被参照型のサイズを考えて)計算して正しい
>値(アドレス)に置き換えてくれてる、ということなのですかね(でしょうね)?

そういうことですね。
[ この投稿を含むスレッドを表示] [ この投稿を削除]