5

重複の可能性:
C - 「char var[]」と「char *var」の違いは?

私は次のCコードを書きました

#include<stdio.h>
int main()
{
    char name[31];
    char *temp;
    int i ;
    scanf("%s",name);
    temp  = name;
    name = temp;

}

コンパイル時に次のエラーが発生しました

incompatible types when assigning to type 'char[31]' from type 'char *'

配列名は最初の要素へのポインタです(ここではcharポインタ..ですよね?)。上記のコードは、文字配列と char* が異なる型であることを意味します..それは本当ですか? なぜ名前の型 != char * なぜ別の char ポインターを char ポインター (配列名) に割り当てることができないのか

4

5 に答える 5

10

配列名は最初の要素へのポインタです(ここではcharポインタ..ですよね?)。右?

違う。配列は、ほとんどのコンテキストで最初の要素へのポインターに減衰しますが、確かにポインターではありません。C FAQと非常に貴重な図 (a は配列、p はポインター)に適切な説明があります。

配列とポインター

タイプ 'char *' からタイプ 'char[31]' に代入するときの互換性のないタイプ

C配列は変更不可能な左辺値であり、そもそもどこも指していないため、それらが指すものを変更することはできません。

于 2012-04-07T12:00:55.893 に答える
6

「配列名は最初の要素へのポインタ(ここではcharポインタ..ですよね?)ですよね?」

char name[31];
char *temp;
/* ... */
name = temp;

name = temp代入では、 の値がへnameのポインタに変換されますcharオブジェクトではなく、値が変換されます。オブジェクトは依然として配列であり、配列は変更可能な左辺値ではありません。代入オペランドの制約では、代入演算子の左オペランドを変更可能な左辺値にする必要があるため、エラーが発生しました。

于 2012-04-07T12:18:58.400 に答える
1

まず、配列はポインターではなくメモリ バッファーですが、必要に応じてポインターに分解される可能性があります。

現在、nameは配列であるため、割り当てることはできません。配列をポインターに割り当てると、配列はポインターに減衰し、割り当ては有効になります。

于 2012-04-07T12:00:48.400 に答える
1

いいえ、ポインターは同じタイプのオブジェクトを指しています。これは、ポインタが適切に割り当てられていれば、完全な配列として使用できることを意味します。
NON ポインターは、ここにデータが「目の前に」あることを意味し、データを適切に取得できません (寿命の問題もあります)。あなたの場合。

于 2012-04-07T12:01:48.183 に答える
1

「名前」は配列だからです。だからこの行:

name = temp;

エラーが発生します。

また、 for ループの条件が間違っています。name[] にはジャンク値が含まれ、使用できません

name[i]!='\0'

条件として。

于 2012-04-07T12:02:31.293 に答える