#include<stdio.h>
int main(){
int a = 320;
char *ptr;
ptr =(char*)&a;
printf("%d",*ptr);
return 0;
}
私はちょうど使用方法を知りたかったでしょう(char*)
?その代わりに(int*)
を使用したらどうなりますか?ポインタの混乱を見つけるには
#include<stdio.h>
int main(){
int a = 320;
char *ptr;
ptr =(char*)&a;
printf("%d",*ptr);
return 0;
}
私はちょうど使用方法を知りたかったでしょう(char*)
?その代わりに(int*)
を使用したらどうなりますか?ポインタの混乱を見つけるには
char *ptr;
文字ポインタのみ、文字型変数を指し示すことができますが、あなたのコード内で使用すると、整数変数を指すようにしたいので、どのようにそれは希望すなわちint a = 320;
あなたのポインタが文字型である、すなわち、あなたの変数が整数型であります可能でしょうか?このコード行で:ptr =(char*)&a;
何をしているのかは、文字型にすることによって、明示的または強制的に(あなたが呼ぶかもしれないものすべて)タイプします。
変数ptr
を呼び出してもポインタにはなりません。あなたはそれがchar
を型へのポインタのような&a
キャスティングint *ptr;
かchar *ptr;
すなわち*で宣言する必要があるポインタになりたい場合、彼らは全く別のものだとしてちょうど愚かです。 (int *)
を使用するので、あなたはそれを置く必要はないと思いますが、その後、あなたのコンパイラがptr
は完全で&a
の値を格納するための間違った型であることを示すだろう&a
の種類を変更しないでしょう。
のは、変更してみましょうプログラムビット:出力がされるリトルエンディアンのシステムで
int main() {
int a = 0x12345678; // put hexadecimal value 12345678 into a
char *charptr = (char*)&a;
int *intptr = &a;
printf("%x\n", *charptr); // %x prints in hexadecimal
printf("%x\n", *intptr);
return 0;
}
:
78
12345678
&a
ですa
変数のメモリアドレス。charptr
はchar
intptr
へのポインタであるint
へのポインタである第二の出力12345678
は明白であるが、第一の出力78
はそれほど明らかではありません。 little endianシステムで
は、メモリのint a
は次のようになります。アドレス&a
で
+----+
| 78 | <---- both 'charptr' and 'intptr' point here
+----+
| 56 |
+----+
| 34 |
+----+
| 12 |
+----+
文字(またはバイト)は、したがって、あなたの場合、あなたが0x78
を得るcharptr
ポインタデリファレンス、0x78となります。
+----+
| 12 | <---- both 'charptr' and 'intptr' point here
+----+
| 34 |
+----+
| 56 |
+----+
| 78 |
+----+
を第1の出力は12
の代わり78
次のようになります。big endianシステムで
我々はこれを持っています。このライン
char *charptr = (char*)&a;
(char*)
で
char
へのポインタとして
&a
を検討するようにコンパイラに指示します。キャストなし
:あなたはchar
へのポインタにint
へのポインタを割り当てるしようとしているため
char *charptr = &a;
あなたは、このようincompatible types - from 'int *' to 'char *'
として警告コンパイラを取得します。
あなたが書いた場合は、この:
char *charptr = (int*)&a;
、あなたはまた、コンパイラ警告incompatible types - from 'int *' to 'char *'
を取得します。とにかくその場合には、&a
はが既にint
へのポインタであるため、(int*)
キャストは役に立たない。
しかし、この目的のために 'char *'を使用するのは良い考えではありません。なぜなら、実装定義の署名があるからです。代わりに 'uint8_t *'を使用してください。 – Lundin
あなたは確かに 'int *'を使うことができます。それはあなたのコードが何をすべきかによって異なります。 – usr