TransWikia.com

¿Por qué un apuntador es capaz de imprimir un string?

Stack Overflow en español Asked by Brandon Jesus Juarez Munguia on November 18, 2021

Quiero saber el porqué, usando apuntadores, esta sección de código imprime de manera correcta el string "Amarillo"

#include <stdio.h>

int main(){
    
    char *color;
    color = "Amarillo";
    
    printf("El color es: %sn", color);
    return 0;
}

One Answer

Un puntero es una variable que almacena la dirección de un espacio en memoria. Cuando haces:

char *color;

Estas creando una variable que apunta a un espacio en memoria, por defecto al no ser inicializada tendrá como contenido la dirección 0 (ver comentario de MrDave1999), podemos ver esto si imprimimos el valor del puntero (la dirección en memoria a donde apunta):

printf("Contenido del puntero "color": %x nn",color);
//===========Resultado:===========
//Contenido del puntero "color": 0 

Ahora, cuando escribes:

color = "Amarillo";

Estás haciendo dos cosas:

  1. Definiendo una string que consiste en un array de caracteres que finalizan en el carácter de final de línea para saber dónde finaliza. Esta variable es constante y no tiene nombre (variable anónima). Esto lo puedes comprobar utilizando el operador & para acceder la dirección de esta variable:

    printf("Dirección de la variable constante "%s": %x nn","Amarillo",&("Amarillo"));
    //===========Resultado:===========
    //Dirección de la variable constante "Amarillo": 0x400714
    

    Puedes imprimir la dirección en cualquier lugar de tu código y verás como siempre va a imprimir la misma, porque tu compilador creó una variable constante para "Amarillo" y cuándo utilizas esa string en tu código, estás haciendo referencia a ella.

  2. Asignas el valor del puntero a la dirección de la nueva variable:

      printf("Contenido del puntero "color": %x nn",color);
     //===========Resultado:===========
     //Contenido del puntero "color": 0x400714
    

Ahora de aquí nacen preguntas:

¿Si el puntero apunta a un array de variables, apunta a cada carácter al mismo tiempo?

R/ Cuando creas un array siempre se guarda o se apunta a la dirección del primer elemento, los arrays son variables que ocupan espacios contiguos en memoria, puedes comprobarlo con este código:

void imprimirElementos(char * stringerino){
    for(int i = 0; i < strlen(stringerino); i++)
    {
        printf("%s[%d] : %c, dirección:%xn",stringerino,i,stringerino[i],&stringerino[i]);
    }
}

imprimirElementos(color)
//===========Resultado:===========
//Amarillo[0] : A, dirección:400714
//Amarillo[1] : m, dirección:400715
//Amarillo[2] : a, dirección:400716
//Amarillo[3] : r, dirección:400717
//Amarillo[4] : i, dirección:400718
//Amarillo[5] : l, dirección:400719
//Amarillo[6] : l, dirección:40071a
//Amarillo[7] : o, dirección:40071b

Mira como la dirección del primer elemento de la string coincide con el valor del puntero color, en otras palabras, el puntero color apunta al primer elemento de nuestro array de caracteres (string). Así es como almacenamos y manejamos los strings, al hacer color[N] estamos diciendo que queremos acceder al elemento en la dirección a la que apunta el puntero color con un desplazamiento de N posiciones en memoria. Esto se puede demostrar con el siguiente código en donde accedemos el valor de r de "Amarillo", es decir, el caso N=3:

printf("*(color+3) = %cn",*(color+3));
printf("color[3] = %cn",color[3]);
//===========Resultado:===========
*(color+3) = r                                                                                                         
 color[3] = r 

¿Cómo es que la función strlen() o printf("El color es: %sn", color); saben cuánto mide mi string si solo estoy apuntando al primer elemento?

R/ En C las strings están terminadas por el carácter que indica que la string finalizó. Las funciones anteriores buscan este carácter en el array para saber el tamaño de la misma, esto quiere decir que el tamaño de "Amarillo" no es realmente 8, si no 9, contando este carácter. Una muestra:

char color1[] = {'r','o','j','o',''};
char color2[] = {'a','z','u','l',''};
printf("color1=%sn",color1);
printf("color2=%sn",color2);
//Sabemos que color1 es:
//color1[0] : r
//color1[1] : o
//color1[2] : j
//color1[3] : o
//color1[4] : 
//Si reemplazamos color1[4] por una letra X entonces el programa no sabrá donde termina la string
//y seguirá buscando por un '/0', casualmente el que sigue es el de la string color2
color1[4] = 'X';
printf("color1=%sn",color1);
printf("color2=%sn",color2);
//===========Resultado:===========
//color1=rojo
//color2=azul
//color1=rojoXazul
//color2=azul

Espero que esto sea de ayuda.

Answered by FranAcuna on November 18, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP