tengo una duda por ejemplo una variable de tipo char almacena 1 solo dato
Correcto. Si deseas almacenar mas no hay otra opción que utilizar un array.
pero en un ejemplo vi un código en el cual hay un puntero de tipo char asi:
char* nombre = "Yahoo";
Qué según tengo entendido es para que la variable de tipo char almacene ma sde 1 dato
No. Una variable de tipo "puntero a T" solo puede almacenar la dirección de un objeto, lo que almacene el objeto apuntado es otra historia.
pero ahora aquí vamos a mi duda porqué se coloca el simbolo de indirección(*)
Porque es una declaración y en ella la única forma de indicar que la variable es un puntero es mediante el carácter '*', no hay '*' entonces no hay puntero:
int numero; /* variable de tipo "int" */
int *p; /* variable de tipo "puntero a int" */
----
Ambas sentencias son equivalentes puesto que tienen el mismo uso de memoria y se usan igual.
No. Ya lo indicaron
durasno y
x64Core, solo voy a explicarlo un poco mas.
Cuando se declara un array puede utilizarse como valor inicial una cadena literal
pero esta es equivalente a una
lista de valores. Siguiendo tu ejemplo:
/* Esta declaracion ... */
char nombre[] = "Yahoo";
/* ... se termina procesando de esta forma */
char nombre[] = {'Y', 'a', 'h', 'o', 'o', '\0'};
Otra historia es la declaración de un puntero inicializando este mediante una literal:
char* nombre = "Yahoo";
Aquí la cadena literal "Yahoo" es de tipo
array de caracteres, se almacena en alguna dirección en memoria y es esa dirección el valor inicial del
puntero.
Además cómo ya hemos dicho, un array no es más que un puntero a su primer elemento.
No. Los arrays y punteros son objetos distintos.
El detalle (o problema, depende de la perspectiva) es: denotar (referirse a) un array mediante su nombre o una expresión resulta (salvo contados casos) en la dirección del primer elemento del array.
El caso mas conocido es el uso de scanf, cuando se trata con esta de leer una palabra utilizamos el nombre de un array sin el operador '&':
char nombre[100];
char (*p)[100] = &nombre;
/* Para indicar que array usar utilizamos: */
puts("Teclea tu nombre:"); scanf("%s", nombre
/* 1) Su nombre */);
puts("Teclea tu nombre:"); scanf("%s", *p
/* 2) Una expresion */);
Uno de los pocos casos donde ello no aplica es el uso del operador sizeof, si su argumento es un array declarado en el mismo ámbito este reportara correctamente el tamaño del array.
Un saludo