3
void say(char msg[])
{   // using pointer to print out the first char of string
    printf("%c\n", *msg);
}

void say(char msg[])
{   // using pointer to print out the memory address of the         first char of string
    printf("%p\n", msg);
}

void say(char msg[])
{   // using pointer to print out the whole string
    printf("%s\n", msg);
}

最初の 2 つは理にかなっていますが、3 番目の機能がどのように機能するかはよくわかりません。私が知っているのは、msg が文字列の最初の文字のメモリ アドレスを指していることだけです。前もって感謝します。

4

5 に答える 5

5

%smsgは、 のアドレスをC 文字列のベース アドレスとして解釈します。これは NULL で終了する ( )バイト'\0'シーケンスです。NULL 文字には遭遇しません。%smsgmsg

于 2012-06-27T10:22:19.290 に答える
3

最後のものは文字列を出力します.. msg のメモリアドレスから始まり、終了文字 '\0' に到達するまで続きます

于 2012-06-27T10:21:09.830 に答える
3

C 文字列は NUL 文字で終了するため\0printf関数はその仮定を取り、ポインターのアドレスを使用して、NUL 文字\0が見つかるまですべての文字を出力します。

渡されたchar配列が NUL 終端されていない場合、NUL 文字が見つからない可能性があり、割り当てられていないメモリ位置に到達するまでごみを出力する可能性があるため、プログラムがクラッシュする可能性があります。

于 2012-06-27T10:21:21.333 に答える
0

フォーマット指定子が %s であるため、最後のステートメントは文字列を想定しています。string はヌル終了文字配列であるため、msg のベース アドレスを開始アドレスとして取り、'\0' に到達するまですべての文字を出力します。

于 2012-06-27T10:31:08.227 に答える