2017-03-23 4 views
1
#include<stdio.h> 

int main(){ 
    int a = 320; 
    char *ptr; 
    ptr =(char*)&a; 
    printf("%d",*ptr); 
    return 0; 
} 

私はちょうど使用方法を知りたかったでしょう(char*)?その代わりに(int*)を使用したらどうなりますか?ポインタの混乱を見つけるには

+3

あなたは確かに 'int *'を使うことができます。それはあなたのコードが何をすべきかによって異なります。 – usr

答えて

2

char *ptr;

文字ポインタのみ、文字型変数を指し示すことができますが、あなたのコード内で使用すると、整数変数を指すようにしたいので、どのようにそれは希望すなわちint a = 320; あなたのポインタが文字型である、すなわち、あなたの変数が整数型であります可能でしょうか?このコード行で:ptr =(char*)&a;何をしているのかは、文字型にすることによって、明示的または強制的に(あなたが呼ぶかもしれないものすべて)タイプします。

0

変数ptrを呼び出してもポインタにはなりません。あなたはそれがcharを型へのポインタのような&aキャスティングint *ptr;char *ptr;

すなわち*で宣言する必要があるポインタになりたい場合、彼らは全く別のものだとしてちょうど愚かです。 (int *)を使用するので、あなたはそれを置く必要はないと思いますが、その後、あなたのコンパイラがptrは完全で&aの値を格納するための間違った型であることを示すだろう&aの種類を変更しないでしょう。

1

のは、変更してみましょうプログラムビット:出力がされるリトルエンディアンのシステムで

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変数のメモリアドレス。
  • charptrchar
  • 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*)キャストは役に立たない。

+1

しかし、この目的のために 'char *'を使用するのは良い考えではありません。なぜなら、実装定義の署名があるからです。代わりに 'uint8_t *'を使用してください。 – Lundin

関連する問題