name = 0xbff5391b
&name[0] = 0xbff5391b
name printed as %s is siva
*name = s
name[0] = s
Entonces, ‘nombre’ es en realidad un puntero a la matriz de caracteres en la memoria. Si intenta leer los primeros cuatro bytes en 0xbff5391b, verá ‘s’, ‘i’, ‘v’ y ‘a’
Location Data
========= ======
0xbff5391b 0x73 's' ---> name[0]
0xbff5391c 0x69 'i' ---> name[1]
0xbff5391d 0x76 'v' ---> name[2]
0xbff5391e 0x61 'a' ---> name[3]
0xbff5391f 0x00 '\0' ---> This is the NULL termination of the string
Para imprimir un carácter, debe pasar el valor del carácter a printf. El valor puede ser referenciado como nombre[0] o *nombre (ya que para un arreglo nombre = &nombre[0]).
Para imprimir una cadena, debe pasar un puntero a la cadena para imprimir (en este caso, ‘nombre’ o ‘& nombre[0]’).
%c
está diseñado para un solo carácter, un carácter, por lo que imprime solo un elemento. Al pasar la matriz de caracteres como un puntero, está pasando la dirección del primer elemento de la matriz (que es un solo carácter) y luego se imprimirá:
s
printf("%c\n",*name++);
imprimirá
I
y así …
El puntero no es necesario para el %s porque puede funcionar directamente con cadenas de caracteres.
Está confundiendo el operador de desreferencia * con la anotación de tipo de puntero *. Básicamente, en C * significa diferentes cosas en diferentes lugares:
En un tipo, * significa un puntero. int es un tipo entero, int* es un puntero a tipo entero
Como operador de prefijo, * significa ‘desreferencia’. nombre es un puntero, *nombre es el resultado de desreferenciarlo (es decir, obtener el valor al que apunta el puntero)
Por supuesto, como operador infijo, * significa ‘multiplicar’.
* en referencia a un puntero, siempre significa lo mismo. simplemente lo estás pensando demasiado (un signo de inteligencia). Míralo así, int *myintptr; significa que la dirección del puntero myintptr está haciendo referencia almacenará un inty el *myintptr = 5; significa que la dirección del puntero myintptr se hace referencia debe contener un 5. el * siempre significa “el valor en”.
– joe peletier
30 de diciembre de 2016 a las 8:17
troyano
El nombre de una matriz es la dirección de su primer elemento, por lo que namees un puntero a la memoria que contiene la cadena “siva”.
Además, no necesita un puntero para mostrar un carácter; solo está eligiendo usarlo directamente desde la matriz en este caso. Podrías hacer esto en su lugar:
char c = *name;
printf("%c\n", c);
Chhavi
Si desea mostrar un solo carácter, también puede usar name[0] en lugar de usar el puntero.
Servirá para su propósito, pero si desea mostrar la cadena completa usando %cpuedes probar esto:
El caso es que la función printf necesita un puntero como parámetro. Sin embargo, un char es una variable a la que tiene acceso directo. Una cadena es un puntero en el primer carácter de la cadena, por lo que no tiene que agregar el * porque * es el identificador del puntero de una variable.
¿Ha sido útil esta solución?
Tu feedback nos ayuda a saber si la solución es correcta y está funcionando. De esta manera podemos revisar y corregir el contenido.
Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos.
Configurar y más información