2017-10-14 17 views
3

なぜint * p = 22のコードでコンパイルエラーが発生し、ptrが値を正常に出力するのですか?C言語の文字ポインタに文字列を割り当てることはできますが、整数値は整数ポインタに割り当てることはできません。

int main() 
{ 

/*taking a character pointer and assigning a string to it*/ 
char *ptr = "Stackoverflow" ; //correct 

/*taking a int pointer and assigning a string to it*/ 
int *p = 22 ; //incorrect 

printf("%s",ptr); // correct and print 
printf("%d",p); //incorrect and give compile time error. 

return 0; 
} 

答えて

0

あなたは

char s[] = "Stackoverflow"; 

用として文字配列を持っている場合、その最初の要素へのポインタに変換される式の中で使用される配列指定子。だから、

char *ptr = s; 

ptrは今、アレイsの最初の文字を指すポインタを書き込むことができます。

Cの文字列リテラルも文字配列のように表現され、静的な記憶期間を持つ文字配列のようなメモリに格納されます。

たとえば、文字列リテラル"Stackoverflow"は、タイプがchar[14](終端ゼロを含む)です。

それではあなたは

char *ptr = "Stackoverflow"; 

を書き、実際にはこの文と同じ

int *p = 22 ; 

この文のよう

static char unnamed[] = "Stackoverflow"; 
char *ptr = unnamed; 

が存在することになるならば、整数リテラルではありません自身へのポインタに変換されます。これは、文字通り22番以上のものを表します。

したがって、ポインタに実際に整数値22が含まれるようにするには、キャストを使用する必要があるため、コンパイラはメッセージを発行します。

22 == 22 

は常にtrueなる式。

コンパイラオプションに応じて、コンパイラは異なるメモリ領域に偶然文字列リテラルを置くことができますので、この表現

"Stackoverflow" == "Stackoverflow" 

が必要利回りtrueはありませんが。この式では、比較される文字列リテラルの最初の文字へのポインタです。

ポインタで指される整数オブジェクトを出力する場合は、逆参照を使用する必要があることを考慮してください。だからではなく、

printf("%d",p); 

のいずれかの場合には、あなたが

printf("%d", *p); 

を書くべきそれとも、出力したい場合は、ポインタに格納された値は、あなたが

別の書式指定子を使用する必要が
printf("%p", p); 
0

この行は、メモリアドレスを22に割り当てます。これは間違っています。この行は警告のみでコンパイルされますが、後でコードのメモリアドレス22にアクセスしようとすると、実行時にプログラムがクラッシュします。

int *p = 22 ; //incorrect 

これはあなたが探している結果が得られます:それはnullで終わる文字列です

int *p = NULL; 
int val = 22; 
p = &val; 

また

printf("%d",p); //incorrect and give compile time error. 
printf("%d",*p); //you must derefence the pointer 

%sはしばらくの間、charへのポインタを取ります%dint*ではなく、intです。

+0

もし何らかの有効なアドレスを与えると、整数ポインタは例えばint * ptr = 0xc0563321となります。 –

+0

そのアドレスが 'int'を保持するために割り当てられていれば、それは理論上有効です。そのアドレスが割り当てられていないと、プログラムがクラッシュします。それは言われている、それはあなたがやるべきことではない、あるいはすべきことではありません。その行をコンパイルしようとすると、 "int *はintからの間接のレベルが異なります"という警告が出ます。ここで22はintです。その警告は正当な理由で発行されます! 'calloc'や' malloc'を使うか、 '&'演算子を使うだけでポインタに割り当てるべきです。 – Nik

+0

@Vladはなぜ 'char * ptr =" Stackoverflow "がうまく動作するかをよく説明しています。 – Nik

0

ので、文字列は実際にはcharの配列であり、配列を変数に代入すると、配列は配列の最初の要素へのポインタとして動作します。これは混乱する可能性があります。このここでの詳細:

when does a array act as a pointer in c?

一方、整数は整数の配列だけ整数、ではありません。

関連する問題