InsideDarkWeb.com

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

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!

Related Questions

Error al comunicar Sentry con Laravel 8

0  Asked on January 21, 2021 by dany-villarroel

   

¿como decifrar la cadena de conexion en el config?

1  Asked on January 21, 2021 by jose-leonardo-quiones

     

Conectar Angular 10 con una api en contenedores docker

0  Asked on January 20, 2021 by jodurpar

     

La conexión java con mysql no funciona

1  Asked on January 20, 2021 by carlos-aburto

     

Editar/Eliminar datos Firebase sobre un RecyclerView

1  Asked on January 19, 2021 by cristian-prieto-beltran

   

¿Cómo mostrar los totales por cada grupo de datos?

1  Asked on January 19, 2021 by jonathan-alarcon

   

¿como puedo insertar datos de un xml a mysql con php?

1  Asked on January 19, 2021 by ivanrangel

     

¿Cómo organizar código en funciones?

3  Asked on January 18, 2021 by alfredo-arvelaez

     

Borrar una carpeta cuando se borra un metodo por su id

0  Asked on January 18, 2021 by erick

 

¿Cómo puedo añadir ceros a la izquierda de un entero?

3  Asked on January 18, 2021 by yasiel-hernndez

 

Cómo obtener un tag específico de un xml con python

1  Asked on January 18, 2021 by luis-benito

   

Registro de archivos copiados y eliminados

0  Asked on January 16, 2021 by dhampircu

   

Ask a Question

Get help from others!

© 2021 InsideDarkWeb.com. All rights reserved.