質問: n; p++; printf("数を入力してください->"); scanf("%d", &n); } while (p > data) { p--; printf("%d\n", *p); } } ``` このようにlongにすると、コンパイルでワーニングは出るのですが、動作は全く同じです。 また、shortやcharにしてもやはり同じで、ワーニングは出ますが動作は*pをintにした時と全く同じです。 ポインタ配列はアドレスを格納する変数という事は知っていますが、アドレスが格納できる容量があれば変数の型はなんでもいいのでしょうか? 今度、組み込み系の仕事をする予定なので、このあたりの違いなどを細かく知りたいと考えいます。 有識者の方、どうぞよろしくお願い致しますm(_ _)m
回答: T *p; でT(int, long, etc.)のサイズによりpを介してアクセスしたときのメモリーのアクセス範囲(バイト数)が違う点に注意が必要なのは他の皆さんの回答のとおりと思いますが、それに加えて**Tによってデータのメモリー上での表現の違いがある**ことも指摘しておいた方がよいかも知れません。 あるプロセッサー用のコンパイラーでfloatとintがどちらも4バイトだとして、次のようなコードを動かすとそれがわかります。 ``` #include int main() { float f = 1.0F; int *pi = (int*)&f; int i = *pi; printf("0x%8x\n", i); // => 0x3f800000 return 0; } ``` 上のようにfloatで1.0だった値をintとしてアクセスすると全く違った値として解釈されてしまいます。このような点からも(特別な意図があってあえてやるのではない限り)**違う型のポインターを用いてはならない**と考えるべきだと思います。 (組み込み系で浮動小数点数(floatなど)をよく使うものかどうかわかりませんが知識としは必要ではないでしょうか)