2011-09-26 10 views
6

¿Cuál es la diferencia entre la siguiente inicialización de un puntero?¿Cuál es la forma correcta de inicializar un puntero en c?

char array_thing[10]; 

char *char_pointer; 

¿cuál es la diferencia de la siguiente inicialización?

1.) char_pointer = array_thing; 

2.) char_pointer = &array_thing 

¿La segunda inicialización es válida?

+3

@ k-ballo No estoy seguro de cómo está llegando a la conclusión de que es tarea. – MGZero

+0

no es tarea. Estoy tratando de aprender C .. – diesel

+1

@ K-ballo: No todos los que hacen preguntas básicas intentan engañar a través de la informática académica, hay algunas personas que realmente quieren aprender. – orlp

Respuesta

5

La segunda inicialización no es válida. Es necesario utilizar:

char_pointer = array_thing; 

o

char_pointer = &array_thing[0]; 

&array_thing es un puntero a una matriz (en este caso, el tipo char (*)[10], y usted está buscando un puntero al primer elemento de la matriz

+0

¡Gracias! esto es lo que pensé – diesel

+0

Sin embargo, la segunda inicialización aún puede funcionar, pero debería lanzar una advertencia acerca de que los tipos de puntero son incompatibles. – Dmitri

+1

@Dmitri, las conversiones de puntero (excepto hacia o desde 'void *') sin tipo de difusión explícita son ilegales en C. ** 6.5.4 Operadores de reparto **, párrafo 3: "Las conversiones que involucren punteros ... se especificarán por de un reparto explícito ". –

0

Tenga en cuenta que no hay inicializaciones en absoluto en el código que ha publicado. Dicho esto, debe tener en cuenta que las matrices decaen en punteros (un puntero al primer elemento dentro de la matriz). es ciertamente válido, pero ahora tienes un (*char)[10] en lugar de char*.

+1

Las matrices (es decir, expresiones del tipo de matriz) decaen a punteros * en la mayoría de contextos * (como lo reconoce implícitamente). Las excepciones son: el operando de un operador '' 'único, el operando de un operador' sizeof' único y un literal de cadena en un inicializador utilizado para inicializar un objeto de matriz (por ejemplo, 'char s [] =" hello "; '). –

0

En el primer caso, se está configurando char_pointer al primer elemento de array_thing (la dirección de la misma, más bien). El uso de la aritmética del puntero lo llevará a otros elementos, como lo hará la indexación. Por ejemplo

char_pointer[3] = 'c'; 

es la misma que

char_pointer + = 3; char_pointer = 'c';

El segundo ejemplo ... No creo que eso sea válido en la forma en que lo hace.

Cuestiones relacionadas