0

簡単な質問です。

書ける

char string[] = "Hello world";
char *p = string;

printf("%s", p);

そして、それHello worldを出力として印刷してもらいます。しかし、ここでポインターはどのように機能していますか?

配列内の各ポイントには、個別のメモリ位置がありますよね?したがって、文字列配列の長さが12の場合、12のメモリスペースを使用します。ポインタは12ではなく1つのメモリ位置しか指すことができないと思いました。ポインタpはこれをどのように達成していますか?

通常の配列とポインタを使用して、配列をスケーリングする場合は、各メモリ位置を調べてその値を出力するときに*p++を実行します。なぜそこに配列を1つずつトラバースする必要があるのですか?しかし、ここでは単に全体を指し示していますか?

1つの(int配列)では、各ポインターが1つのメモリ位置しかポイントできないため、ポインターをインクリメントしているように見えますが、char配列では、何らかの方法ですべてのポインターを指すことができます。

4

4 に答える 4

3

そうです、ポインタは1つのメモリ位置しか指すことができません。配列を処理する場合、ポインターは最初の要素の位置を指します。を使用するprintfと、基本的にポインタ(文字列の最初の要素を指す)を取得し、nullの終了文字である。に到達するまで出力します\0

これがcのポインタと配列の良い説明です:

http://www.cs.bu.edu/teaching/cpp/string/array-vs-ptr/

于 2012-04-09T00:22:14.640 に答える
2

ポインタは12ではなく1つのメモリ位置しか指すことができないと思いました。ポインタpはこれをどのように達成していますか?

pchar配列へのポインタであり、配列へのポインタではありません。配列の最初の要素を指しstringます。

これで、配列の値は最初の要素へのポインターになるため、この宣言は次のようになります。

 char *p = string;

実際には次と同等です:

 char *p =  &string[0];

ポインタをインクリメントする場合:

 p++;

p配列の次の要素、つまりを指しstring[1]ます。

于 2012-04-09T00:24:07.897 に答える
1

配列へのポインタは実際には最初のアドレスへのポインタです...そしてprintfはnull文字が見つかるまでそのアドレスからスキャンします...%cと%sはその動作が異なります

于 2012-04-09T00:26:21.793 に答える
1

%sそれまで印刷するので使用し'\0'ます。

なぜそこに配列を1つずつトラバースする必要があるのですか?しかし、ここでは単に全体を指し示していますか?

ここでは、charへのポインタを使用し、文字列を出力したいとします。だから大丈夫です。intまたは他の型へのポインタを使用している場合、これは完全には機能しないと仮定します。したがって、ポインタ演算のようなものp++が使用されます。

于 2012-04-09T00:28:37.630 に答える