あなたは
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);
もし何らかの有効なアドレスを与えると、整数ポインタは例えばint * ptr = 0xc0563321となります。 –
そのアドレスが 'int'を保持するために割り当てられていれば、それは理論上有効です。そのアドレスが割り当てられていないと、プログラムがクラッシュします。それは言われている、それはあなたがやるべきことではない、あるいはすべきことではありません。その行をコンパイルしようとすると、 "int *はintからの間接のレベルが異なります"という警告が出ます。ここで22はintです。その警告は正当な理由で発行されます! 'calloc'や' malloc'を使うか、 '&'演算子を使うだけでポインタに割り当てるべきです。 – Nik
@Vladはなぜ 'char * ptr =" Stackoverflow "がうまく動作するかをよく説明しています。 – Nik