最初に: STRCAT :
明らかに定義が言うとき:
char * strcat ( char * destination, const char * source );
なぜ彼らは例で char str[80] を使用したのですか??? 彼らは文字ポインタを使用すべきではありませんでしたか?
最初に: STRCAT :
明らかに定義が言うとき:
char * strcat ( char * destination, const char * source );
なぜ彼らは例で char str[80] を使用したのですか??? 彼らは文字ポインタを使用すべきではありませんでしたか?
これは、C/C++ では配列がポインターに分解されるためです。s の値を定義するchar s[80]
と、最初の文字のアドレスになります。&s[0]
配列はポインタとしても使用できます。必要なstrcat
のは、宛先文字列をコピーするメモリへのポインタです。この場合 str[80]
、80文字を保持できるメモリが得られます。
char str[80];
80文字の配列を宣言します。ただし、CおよびC ++では、配列は暗黙的にポインターに変換されます。配列を関数(strcatなど)に渡すと、配列は自動的に「減衰」し、配列の最初の要素へのポインターを形成します。
これは、配列とポインタが同じものであると言うことと同じではありません。そうではありません。たとえばsizeof()
、上記の配列とで異なる結果が得られますchar*
。
厳密に言えば、配列はメモリ ブロックの先頭へのポインタです。80文字の先頭を指す も同様ですstr
。char *
配列にインデックスを付けると、たとえば位置 53 は次のようになります。 str とstr[53]
同じです。文字ポインターに 53 を追加するとポインターが返されるため、内部の値を取得するには、アスタリスクを使用して逆参照する必要があります。ポインター。実際、配列表記は、特定の状況でコードを読みやすくするだけです。*(str + 53)
char *
実際、文字列をコピーするときに先頭のテキストをスキップしたい場合は、char の配列を使ったちょっとしたトリックです。たとえば、配列str[80]
に string が含まれているとします"1023: error in code!"
。そして、前に数字を付けずに文字列だけを表示したいとします。この場合、あなたは言うことができ、印刷されるprintf( "%s", str + 6 )
だけです。"error in code!"
char str[80];
編集:おっと、私は答えを急ぎました。dribeas が言うように、ステートメントは配列を宣言し、使用時に str を暗黙的にポインターに変換できます。例えば:
++str;
は無効な操作です:
char* ptr;
++ptr;
そうではありません。