2017-04-06 4 views
0
void main() 
{ 
    char str1[10], str2[10] = "haha"; 
    strcpy(str1, str2); 
    puts(str1); 
    strcpy(str1, "tictoc"); 
    puts(str1) ; 
} 

上記のコードに示すように、C言語で定義済みのstrcpy関数を使用してポインタ変数にadressおよび文字列定数を渡すにはどうすればよいですか?strcpy関数はどのようにしてadressとstringの両方の定数を受け入れることができますか?

+0

str1とstrは定数ではありません。 str変数は値を持ちますが、 'const'ではありません。 strcpy()に渡されるパラメータは両方とも変数のアドレスです。 – lit

+0

str2が定義されていません。 –

答えて

1

配列が関数に渡されると、配列は最初の要素へのポインタに減衰します。

str1strの両方がタイプchar [10]です。これらはそれぞれ、strcpyに渡されると、char *に減衰します。同様に、文字列定数は、タイプchar [7](文字列の各文字に1バイトプラス終端のヌルバイト)もあり、それもchar *に減衰します。

constパラメータが必要な関数は、同じデータ型の非constバージョンを使用できます。 strcpyの2番目のパラメータはconst char *となるので、char *もこの引数を満たします。

一方、const型以外の型を必要とする関数にconst変数を渡そうとすると、コンパイラの警告が生成されます。

+0

おかげで、constが仕事をどのように果たすのか説明できますか? –

+0

'const'を' const char * 'のようにfunctionパラメータの一部として持つ@SuvashRajは、関数があなたが渡すデータを変更しないことを保証します。あなたがそれを与えるデータ。機能や必要なことによっては、これが望ましいかもしれませんし、そうでないかもしれません。しかし、あなたの変更可能な 'char *'を 'const char * 'を求める関数に渡すことは、その関数で処理されている間に変更されないことを意味します。この場合、 'const'から非constにコピーするために使われているだけです。 – Cody

関連する問題