#include<stdio.h>
int main()
{
printf("%c",*"abcde");
return 0;
}
このプログラムの出力はどのように 'a' になりますか? ターボcでコンパイルしたときに出力が「a」である理由と、ここでの「*」は何を意味するのか教えてください。
#include<stdio.h>
int main()
{
printf("%c",*"abcde");
return 0;
}
このプログラムの出力はどのように 'a' になりますか? ターボcでコンパイルしたときに出力が「a」である理由と、ここでの「*」は何を意味するのか教えてください。
"abcde"
は文字列リテラルであるため、配列型を持ちます。sizeof
または のオペランド以外のコンテキストで&
は、配列はその最初の要素へのポインタに崩壊します。したがって、単項演算子のオペランドとして使用すると*
、"abcde"
は文字列の先頭にある "a" へのポインターに評価され、*
演算子はそのポインターを逆参照して、値 を取得します'a'
。この値 (整数) をフォーマット指定子でフォーマットするprintf
ために渡すと、対応する文字 "a" が stdout に出力されます。%c
printf
"abcde"
文字の配列 ( ) である文字列リテラルchar[]
です。通常、プログラムの読み取り専用データ セクションに配置されます。それを に渡す場合printf
、コンパイラは実際にはその配列のアドレスを に渡していますprintf
。
ただし、ここでは、最初の文字だけを渡すポインターを逆参照しています。
これは、より意味のある同等のより詳細なバージョンです。
const char* str = "abcde"; // str is a char* pointer to "abcde"
char c = *str; // De-reference that pointer - in other words,
// get me the char that it points to.
printf("%c", c); // Pass that char to printf, where %c is
// expecting a char.