UTNianos

Versión completa: Duda con punteros
Actualmente estas viendo una versión simplificada de nuestro contenido. Ver la versión completa con el formato correcto.
Dudaa en el codigo



#include <stdio.h>
int main (void)
{
char *a[2];
char d[10];
printf("Escriba: ");
scanf("%s",d);
a[2]=d;
printf("Es: %s\n",*(a+2)); // DUDA
return 0;
}



Por que cuando cambio *(a+2) por *a[2] no copila? tira error como "main.c:10:3: warning: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘int’ [-Wformat]" si deberia ser lo mismo.
El nombre de un vector es un puntero al inicio del mismo.
Hacer *(a+2) es lo mismo que a[2], porque "a" es un puntero, y en este caso es un vector de punteros.
En el elemento 2 cargás el puntero a "d".
Me parece que no tiene sentido cargar el elemento 2, porque ya declarás el vector como de dos elementos: el cero y el uno, o sea, a[0] y a[1]. El a[2] es memoria no asignada (o como se llame). Estás pisando lo que haya ahí.

¿Esa es la duda? Porque medio que no aclarás.


a[2]=d;



Ojo que si el arreglo tiene dimension 2, sus elementos son 0 y 1. Salvo que programes en BASIC.



char *a[2];
printf("Es: %s\n",*(a+2)); // DUDA



Vos declaras a como puntero a puntero a char.
Cuando lo usás con aritmética de punteros tenés que 'desreferenciar', por eso pones el asterisco, para pasar de puntero puntero a char a puntero a char.
Por otro lado, a[2] ya es un puntero a char, si usás la notación de arreglo no tenés que desreferenciar nada.

Pensalo con la primera posicion, ahí a[0] equivale a *a.
Si ahi le cambie a a[1]. Asi con este codigo anda copila y todo. pero sigo sin entender porque si cambio "*(a+1)" por *a[1] no me copila?


#include <stdio.h>

int main (void)
{
char *a[2];
char d[10];
printf("Escriba: ");
scanf("%s",d);
a[1]=d;
printf("Es: %s\n",*(a+1));// DUDA

return 0;
}



(18-09-2014 19:25)leibniz escribió: [ -> ]


a[2]=d;



Ojo que si el arreglo tiene dimension 2, sus elementos son 0 y 1. Salvo que programes en BASIC.



char *a[2];
printf("Es: %s
",*(a+2)); // DUDA



Vos declaras a como puntero a puntero a char.
Cuando lo usás con aritmética de punteros tenés que 'desreferenciar', por eso pones el asterisco, para pasar de puntero puntero a char a puntero a char.
Por otro lado, a[2] ya es un puntero a char, si usás la notación de arreglo no tenés que desreferenciar nada.

Pensalo con la primera posicion, ahí a[0] equivale a *a.

Ahhh ya entendii gracias chee!!
*a[1] == **(a+1)
URLs de referencia