0

重複の可能性:
C の char s[] と char *s の違いは何ですか?

char *p="Help"
printf("%ud",p);

出力として「ヘルプ」のベースアドレスを取得します。それは、文字列(「ヘルプ」)が常にそのベースアドレスを返すことを意味しますか?そうであれば、これはC++の場合と同じですか?

また、以下で何が起こっているのかを正確に説明できますか。

char name[]="Hello";

私はこれがばかげていることを知っていますが、私の脳は平和ではありません.

4

4 に答える 4

1

投稿で指定した最初の例では、文字が格納されているメモリ内のアドレスを指すポインターを使用しています。そのため、 p を出力するとアドレスが取得されます。

2番目の例では、それぞれが「Hello」に文字を格納する文字の配列を作成しています。配列は、各文字が連続したメモリ位置に格納されるという点で、いくつかの同様のメモリ アクセス原則を使用します。したがって、name[] はメモリ位置であり、アクセスするすべてのインデックスは、最初の要素が存在する最初のポインタ name[] へのメモリ内のオフセットです。

簡単にするために、name[0] = 0x00、name[1] = 0x01、name[2] = 0x02 などとします。これで、これらのメモリ位置のそれぞれに、文字列 "Hello" の一部を表す値が保持されます。アクセスすると、アクセスしているインデックスによって name[x] がどこにあるかがわかり、要素へのアクセス方法に応じて、そのメモリ位置または文字が取得されます。

于 2012-06-08T13:11:51.453 に答える
0

で使用%uするprintfと、常に任意の変数の値が出力されます。そして、あなたは変数として文字列を使用しています。文字列では、文字列の最初の文字のアドレスとベースア​​ドレスは同じです。したがって、常に文字列のベースアドレスが表示されます。例えば、

char *p="Help";
printf("%u",p);

常にベースアドレスを表示します。

そして、2番目の質問に関しては、暗黙的および明示的な初期化の概念を知っている必要があります。文字配列のサイズを手動で指定すると、明示的な初期化と呼ばれます。例char str[10]="abcdef";

また、のような他のケースchar str[]="abcd";では、文字列の長さを文字配列のサイズとして暗黙的に取ります(この場合、0から3で始まり、ヌル文字'\ 0'で終わる4)。ご理解いただければ幸いです。

于 2012-06-08T13:24:45.100 に答える
0

文字列を印刷したい場合は、次のようにします。

char *p="Help"
printf("%s",p);

この線

char name[]="Hello";

nameの配列として宣言しchar、リテラル(または"Hello"で終わる 5 つの ASCII 文字) を含むように初期化します。0NULL

于 2012-06-08T13:03:40.043 に答える
0

C の文字列は、メモリ内の文字の配列です (ヌル文字で終了)。例の変数pは、そのメモリアドレスへのポインターであり、これが出力されます。

2 番目の例は同じですが、(コンパイラの選択とは対照的に) スタックで配列を宣言する点が異なります。

主な違いは、配列 ( []) 表記を使用すると、配列 (したがって文字列) のサイズを簡単に計算できることですが、ポインター表記を使用すると、サイズを計算するために配列をトラバースして末尾を見つける必要があります。

これは C++ でも似ていますが、std::string動的なメモリ管理を可能にするため (文字列を連結する場合など)、型を使用することをお勧めします。

于 2012-06-08T13:04:34.330 に答える