簡単な例を考えてみましょう
Eg: const char* letter = "hi how r u";
letterは、文字列「hihowru」を指すconst文字ポインタです。データを印刷したり、データにアクセスしたりする場合は、*letter
正しく使用する必要がありますか?
しかし、この状況では、printfの呼び出しでアドレスを使用するだけでよいのではないでしょうか。
printf("%s",letter);
では、これはなぜですか?
*letter
実際にはキャラクターです。それがletter
指す最初の文字です。文字列全体を操作している場合、慣例により、関数はゼロ('\ 0')バイトが表示されるまで、その文字と次の文字などを調べます。
一般に、要素の束(つまり、配列)へのポインターがある場合、ポインターは最初の要素を指します。どういうわけか、その要素の束を操作するコードは、その数を知る必要があります。にはchar*
、ゼロの規則があります。他の種類の配列の場合、長さを別のパラメーターとして渡さなければならないことがよくあります。
printfが次のような署名を持っているという理由だけで、int printf(const char* format, ...);
これはcharテーブルへのポインタを期待していることを意味します。これは内部的に逆参照されます。
文字は文字列全体を指しているのではなく、文字列の最初の文字を指しているため、charポインタを指します。
ポインタを(で*
)間接参照すると、文字列の最初の文字を参照することになります。
ただし、単一の文字はprinf(文字列を出力する場合)によく使用されるため、代わりに最初の要素へのポインターを取得し、ヌル文字が「\ 0」になるまで、その値をインクリメントして間接参照値を出力します。
これはC++の質問であるため、文字列を安全なカプセル化タイプとして実際に格納する必要がstd::string
あり、可能な場合はタイプセーフなiostreamを使用する必要があることに注意することも重要です。
std::string line="hi how r u";
std::cout << line << std::endl;
%s
\0
最初の参照まで印刷します:http: //msdn.microsoft.com/en-us/library/hf4y5e3w.aspxは、%s
文字列形式のフィールドであり、ここで奇妙なことは何も起こっていません。
printf("%s")
NULL
(\0
)=文字列の終わりを検索するメモリを通過するためにアドレスを期待します。この場合、あなたはただと言いますletter
。アドレスではなく値をprintf("%c")
期待するには:printf("%c", *letter);
printf
データ配列へのポインタを引数として取ります。したがって、、、、などを含む文字列(配列の一種)または数値を表示する場合は、%s
常に。を付けずに変数名を渡します。変数名は配列の最初の要素へのポインターであり、EOLまたはゼロ値。%d
%e
%f
*
printf
char
int
もちろん、配列変数へ*
のポインターを作成する場合は、そのポインターを。で逆参照する必要があります。しかし、それはルールよりも例外です。:)