2
#include<stdio.h>

int main()
{
    printf("%c",*"abcde");
    return 0;
}

このプログラムの出力はどのように 'a' になりますか? ターボcでコンパイルしたときに出力が「a」である理由と、ここでの「*」は何を意味するのか教えてください。

4

2 に答える 2

2

"abcde"は文字列リテラルであるため、配列型を持ちます。sizeofまたは のオペランド以外のコンテキストで&は、配列はその最初の要素へのポインタに崩壊します。したがって、単項演算子のオペランドとして使用すると*"abcde"は文字列の先頭にある "a" へのポインターに評価され、*演算子はそのポインターを逆参照して、値 を取得します'a'。この値 (整数) をフォーマット指定子でフォーマットするprintfために渡すと、対応する文字 "a" が stdout に出力されます。%cprintf

于 2012-12-16T04:23:52.300 に答える
2

"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.
于 2012-12-16T04:12:14.470 に答える