2012-04-07 20 views
5

Eventuali duplicati:
C - Difference between “char var[]” and “char *var”?Differenza tra char * e char [] in C

Ho scritto il seguente codice C

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

} 

ho ottenuto il seguente errore in fase di compilazione

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

Il nome della matrice è un puntatore al primo elemento (qui puntatore char ..right?). giusto? Il codice sopra indica che l'array di caratteri e il carattere * sono tipi diversi. È vero? Perché tipo di nome! = Char * perché non posso assegnare un puntatore char a un puntatore char (nome di matrice)

+0

Si prega di dare un'occhiata alle FAQ C prima di fare una domanda qui. –

risposta

5

"Il nome della matrice è un puntatore al primo elemento (qui il puntatore del char ... giusto?). Giusto?"

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

Nell'assegnazione name = temp, il valore di name viene convertito in un puntatore a char. Il valore viene convertito, non l'oggetto. L'oggetto è ancora un array e gli array non sono lvalue modificabili. Poiché i vincoli dell'operando di assegnazione richiedono che l'operando di sinistra dell'operatore di assegnazione sia un lvalue modificabile, si ottiene un errore.

+0

Downvoter, per favore spiega perché hai downvoted questa risposta. – ouah

+0

+1 per compensare :) –

+0

@JensGustedt Grazie Jens;) – ouah

1

Innanzitutto, gli array sono buffer di memoria, non puntatori, anche se potrebbero essere decaduti ai puntatori quando necessario.

Ora, name è un array, quindi non è possibile assegnarlo. quando assegni una matrice a un puntatore, la matrice viene decaduta in un puntatore e l'assegnazione è valida.

+0

Si tratta di nuove informazioni per me ... Grazie –

9

Il nome di matrice è un puntatore al primo elemento (qui puntatore char ..right?). giusto?

Errore. Array decadimento in un puntatore al primo elemento nella maggior parte dei contesti, ma di certo non sono puntatori. C'è una buona spiegazione nella C FAQ e un quadro prezioso (una è un array e p è un puntatore):

Arrays and pointers

tipi incompatibili quando si assegna al tipo 'char [31]' dal tipo 'char *'

in matrici C sono lvalue non modificabili, non si può cambiare a cosa puntano in quanto non puntano da nessuna parte, in primo luogo.

+0

grazie per il link ... –

+0

Ok ... ottenuto gli array punto sono lvalue non modificabili ... Ciò significa non posso anche fare char name [31] ; char temp [31]; int i; scanf ("% s", nome); temp = nome; nome = temp; giusto? ... Anche come rientro codice quando commento qui? :) –

+0

La scansione è quasi ok (rilascia il &). Il resto è sbagliato. – cnicutar

1

No, il puntatore punta verso un oggetto dello stesso tipo. Ciò significa che un puntatore può essere usato come array completo se è allocato correttamente.
Un puntatore NON significa che hai i dati qui "di fronte a te", che non ti permettono di ottenere correttamente i dati (ha anche problemi di tempo di vita), quindi per essere onesti, i puntatori sono meglio da usare ovunque nel tuo caso.

1

Perché "nome" è un array. Così Questa linea:

name = temp; 

vi darà errore.

Anche la condizione nel ciclo for è errata. nome [] avrà valori di posta indesiderata e non è possibile utilizzare

name[i]!='\0' 

come condizione.

+0

appena rimosso il bug –