2012-04-07 56 views
5

Duplicar posibles:
C - Difference between “char var[]” and “char *var”?Diferencia entre char * y char [] en C

He escrito el siguiente código C

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

} 

Tengo el siguiente error al compilar

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

Nombre de la matriz es un puntero al primer elemento (aquí char puntero ... ¿correcto?). ¿Correcto? El código anterior significa que la matriz de caracteres y char * son tipos diferentes. ¿Es cierto? qué tipo de nombre! = Char * por qué no puedo asignar otro puntero char a un puntero char (nombre de la matriz)

+0

Eche un vistazo a las preguntas frecuentes de C antes de hacer una pregunta aquí. –

Respuesta

5

"Nombre de la matriz es un puntero al primer elemento (aquí char puntero ... ¿correcto?) ¿No?"

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

En la asignación name = temp, el valor de name se convierte en un puntero a char. El valor se convierte, no el objeto. El objeto sigue siendo una matriz y las matrices no son valores l modificables. Como las restricciones del operando de asignación requieren que el operando izquierdo del operador de asignación sea un valor l modificable, se produjo un error.

+0

Downvoter, explique por qué ha votado negativamente esta respuesta. – ouah

+0

+1 para compensar :) –

+0

@JensGustedt Gracias Jens;) – ouah

1

En primer lugar, las matrices son buffers de memoria, no los punteros, aunque podrían ser decayeron a los punteros cuando sea necesario.

Ahora, name es una matriz, por lo que no puede asignarla. cuando asigna una matriz a un puntero, la matriz se descompone en un puntero y la asignación es válida.

+0

Esta información es nueva para mí ... Gracias –

9

Nombre de la matriz es un puntero al primer elemento (aquí char puntero ... ¿correcto?). ¿verdad?

Wrong. Arrays decay a un puntero al primer elemento en la mayoría de los contextos, pero ciertamente no son punteros. Hay una buena explicación en el C FAQ y una imagen de gran valor (a es una matriz y p es un puntero):

Arrays and pointers

tipos incompatibles en la asignación al tipo 'char [31]' del tipo char' *'

en las matrices C son lvalues ​​no modificables, no se puede cambiar lo que señalan ya que no apuntan en cualquier lugar en el primer lugar.

+0

gracias por el enlace ... Ok ... –

+0

obtuvieron las matrices de puntos son lvalues ​​no modificables ... Eso significa no puedo también hacer char nombre [31] ; char temp [31]; int i; scanf ("% s", nombre); temp = name; name = temp; ¿verdad? ... ¿También cómo sangrar el código cuando comento aquí? :) –

+0

El escaneo está casi bien (suelte el signo &). El resto es incorrecto – cnicutar

1

No, el puntero apunta hacia un objeto del mismo tipo. Esto significa que un puntero se puede usar como una matriz completa si se asigna correctamente.
Un puntero NO significa que tiene los datos aquí "delante de usted", lo que no le permite obtener los datos correctamente (también tiene problemas de tiempo de vida), por lo que para ser honesto, es mejor usar punteros en todas partes en tu caso.

1

Porque 'name' es una matriz. Así Esta línea:

name = temp; 

le dará error.

También su condición en el bucle for es incorrecta. nombre [] tendrá valores basura y no puede usar

name[i]!='\0' 

como condición.

+0

acaba de eliminar ese error –

Cuestiones relacionadas