2012-04-07 24 views
5

Mögliche Duplizieren:
C - Difference between “char var[]” and “char *var”?Unterschied zwischen char * und char [] in C

ich den folgenden C-Code

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

} 

Ich habe die folgende Fehlermeldung geschrieben habe beim Kompilieren

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

Array-Name ist ein Zeiger auf das erste Element (hier Char-Zeiger .. rechts?). richtig? Der obige Code bedeutet, dass Zeichenarray und char * verschiedene Typen sind .. Ist es wahr? Warum Art der Name! = Char * , warum ich nicht einen anderen char Zeiger auf ein char-Zeiger (Array-Namen) zuweisen können

+0

Bitte werfen Sie einen Blick in die C FAQ, bevor Sie hier eine Frage stellen. –

Antwort

5

"Array-Name ist ein Zeiger auf das erste Element (hier char Zeiger. Recht?). Recht?"

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

Im name = temp Zuordnung wird der Wert von name auf einen Zeiger auf char umgewandelt. Der Wert wird konvertiert, nicht das Objekt. Das Objekt ist immer noch ein Array und Arrays sind nicht modifizierbare lvalues. Da die Randbedingungen des Zuweisungsoperanden erfordern, dass der linke Operand des Zuweisungsoperators ein modifizierbarer L-Wert ist, ist ein Fehler aufgetreten.

+0

Downvoter, bitte erklären, warum Sie diese Antwort downvoted. – ouah

+0

+1 zu kompensieren :) –

+0

@JensGustedt Danke Jens;) – ouah

1

Zuerst Arrays sind Speicherpuffer, keine Zeiger, obwohl sie auf Zeiger abgeklungen sein könnten, wenn nötig.

Jetzt ist name ein Array, das Sie ihm nicht zuweisen können. Wenn Sie einem Zeiger ein Array zuweisen, wird das Array in einen Zeiger umgewandelt und die Zuweisung ist gültig.

+0

Das ist eine neue Information für mich ... Danke –

9

Array-Name ist ein Zeiger auf das erste Element (hier Char-Zeiger .. rechts?). richtig?

Falsch. Arrays zerfallen zu einem Zeiger auf das erste Element in den meisten Kontexten, aber sie sind sicherlich keine Zeiger. Es gibt eine gute Erklärung in den C FAQ und ein wertvolles Bild (a ein Array ist und p ist ein Zeiger):

Arrays and pointers

inkompatible Typen bei der Zuordnung 'char [31]' eintippen von Typ ‚char *‘

in C-Arrays sind nicht modifizierbaren lvalues, Sie nicht, was sie zu Punkt ändern kann, da sie überall in erster Linie nicht Punkt.

+0

danke für den Link ... –

+0

Ok ... bekam die Punktfelder nicht modifizierbar lvalues ​​sind ... Das bedeutet kann ich nicht auch char name [31] tun ; Char Temp [31]; int i; scanf ("% s", Name); Temp = Name; Name = Temp; richtig? ... Auch, wie Code einrücken, wenn ich hier kommentieren? :) –

+0

Das scanf ist fast ok (drop the &). Der Rest ist falsch. – cnicutar

1

Nein, der Zeiger zeigt auf ein Objekt des gleichen Typs. Dies bedeutet, dass ein Zeiger als vollwertiges Array verwendet werden kann, wenn er richtig zugeordnet ist.
Ein NICHT-Zeiger bedeutet, dass Sie die Daten hier "vor Ihnen" haben, wodurch Sie die Daten nicht richtig erhalten (hat auch Probleme mit der Lebensdauer), also sind Zeiger besser zu verwenden überall in deinem Fall.

1

Weil 'name' ein Array ist. So Diese Zeile:

name = temp; 

geben Ihnen Fehler.

Auch Ihre Bedingung in der for-Schleife ist falsch. Name [] wird Junk-Werte haben und Sie können nicht

name[i]!='\0' 

als Bedingung verwenden.

+0

nur entfernt, dass Bug –

Verwandte Themen