以下のような実験コードを作りました。
C
1#include<stdio.h> 2 3int main(){ 4 double x; 5 double* pd; 6 7 char* pc = &x; 8 pc++; 9 pd = (double *)pc; 10 11 printf("pc = %p\n", pc); 12 printf("pd = %p\n", pd); 13 return 0; 14}
すごく簡単にするために
pcのアドレスは 8 とします。
pc++ で 9となります。
pd = (double *)pc; こいつです!
doubleが8バイトの境界調整をもつならば、9というアドレスは中途半端です。
この場合、pdのアドレスは8 もしくは 16 になる可能性があるそうです。
実際にやったら、アドレスが同じになりました。 pc = 003DFB81 pd = 003DFB81
char* pc = &x;
これは、「暗黙的にキャストが行われている」と思います。
pd = (double *)pc;
こちらは、「明示的にキャストが行われています」(多分)
1、この2つ(明示的キャスト、暗黙的キャスト)正直何が違うんですか?? 明示的にキャストする場合としなくても良い場合の違いがわかりません。C/C++でも違いがあるそうですが・・・
2、アライメントを考慮すると「暗黙的、明示的関係なく、ポインタを別の型のポインタへのキャストする」のは控えた方がよろしいんですかね???
3、この実験コードに修正箇所があれば、教えてください。
[追記]
実験したのはwindowsです。
visual studioでオプションは何も入れないで、clコンパイルしています。
[追記2]
私のC言語の本にこう書いてあります。
ポインタを他の型へのポインタに型変換することは、その値までもが変わる可能性のある危険な行為であり、注意深く行わなければならない。型や型変換に対して厳密なC++が、voidへのポインタを別の型のポインタに代入する局面で明示的なキャストを必須としているのは、このような危険を避けるためです。
えーーーと
明示的なキャストすることで、どうしてポインタを他の型へのポインタに変換する際の危険性を避けることができるのでしょうか??
回答4件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/01/20 10:19
2017/01/20 10:22