3

簡単な例を考えてみましょう

Eg: const char* letter = "hi how r u";

letterは、文字列「hihowru」を指すconst文字ポインタです。データを印刷したり、データにアクセスしたりする場合は、*letter正しく使用する必要がありますか?

しかし、この状況では、printfの呼び出しでアドレスを使用するだけでよいのではないでしょうか。

printf("%s",letter);

では、これはなぜですか?

4

6 に答える 6

8

*letter実際にはキャラクターです。それがletter指す最初の文字です。文字列全体を操作している場合、慣例により、関数はゼロ('\ 0')バイトが表示されるまで、その文字と次の文字などを調べます。

一般に、要素の束(つまり、配列)へのポインターがある場合、ポインターは最初の要素を指します。どういうわけか、その要素の束を操作するコードは、その数を知る必要があります。にはchar*、ゼロの規則があります。他の種類の配列の場合、長さを別のパラメーターとして渡さなければならないことがよくあります。

于 2012-04-24T13:29:01.643 に答える
1

printfが次のような署名を持っているという理由だけで、int printf(const char* format, ...);これはcharテーブルへのポインタを期待していることを意味します。これは内部的に逆参照されます。

于 2012-04-24T13:29:38.043 に答える
1

文字は文字列全体を指しているのではなく、文字列の最初の文字を指しているため、charポインタを指します。

ポインタを(で*)間接参照すると、文字列の最初の文字を参照することになります。

ただし、単一の文字はprinf(文字列を出力する場合)によく使用されるため、代わりに最初の要素へのポインターを取得し、ヌル文字が「\ 0」になるまで、その値をインクリメントして間接参照値を出力します。

これはC++の質問であるため、文字列を安全なカプセル化タイプとして実際に格納する必要がstd::stringあり、可能な場合はタイプセーフなiostreamを使用する必要があることに注意することも重要です。

std::string line="hi how r u";
std::cout << line << std::endl;
于 2012-04-24T13:30:41.687 に答える
1

%s\0最初の参照まで印刷します:http: //msdn.microsoft.com/en-us/library/hf4y5e3w.aspxは、%s文字列形式のフィールドであり、ここで奇妙なことは何も起こっていません。

于 2012-04-24T13:30:58.350 に答える
1

printf("%s")NULL\0)=文字列の終わりを検索するメモリを通過するためにアドレスを期待します。この場合、あなたはただと言いますletter。アドレスではなく値をprintf("%c")期待するには:printf("%c", *letter);

于 2012-04-24T13:31:00.360 に答える
1

printfデータ配列へのポインタを引数として取ります。したがって、、、、などを含む文字列(配列の一種)または数値を表示する場合は、%s常に。を付けずに変数名を渡します。変数名配列の最初の要素へのポインターであり、EOLまたはゼロ値。%d%e%f*printfcharint

もちろん、配列変数*のポインターを作成する場合は、そのポインターを。で逆参照する必要があります。しかし、それはルールよりも例外です。:)

于 2012-04-25T02:48:07.240 に答える