es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo justificar la salida de un programa de matriz de punteros a punteros de tipo char

#include <stdio.h>

#define STOP 0

void function(char*);
int main() {
    char* arr[] = { "icsp","hw6","fall","spring","autumn","winter" };
    function(arr);
    return 0;
}
void function(char* ptr) {
    char* ptr1;
    ptr1 = (ptr += sizeof(int))[-2];
    printf("%s\n", ptr1);
}

Tengo este código como tarea para explicar cómo funciona. No entiendo cómo funciona realmente este puntero a un array de punteros y qué hace esta línea ptr1 = (ptr += sizeof(int))[-2];?
La salida es

fall

Estaré muy agradecido si me lo explicas.</stdio.h>

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Explicación del código

    Primero, vamos a entender qué hace el código.

    1. Se define y se inicializa un arreglo de cadenas de caracteres en C (char* arr[]) con seis cadenas.
    2. Se llama a la función con el arreglo arr como argumento.
    3. La función recibe un puntero a un puntero a un carácter (char **ptr) como argumento.
    4. Dentro de la función, se define un puntero char* llamado ptr1.
    5. El puntero ptr se incrementa por el tamaño de un entero. Esto significa que ptr ahora apunta al tercer elemento del arreglo arr (&arr[2]).
    6. El [-2] al final de la línea accede al elemento dos posiciones detrás de la posición actual de ptr. Esto significa que ptr1 ahora apunta al cuarto elemento del arreglo arr (&arr[3]).
    7. Se imprime por consola la cadena apuntada por ptr1, es decir, "fall".

    Explicación de la línea ptr1 = (ptr += sizeof(int))[-2];

    Ahora desglosemos la línea ptr1 = (ptr += sizeof(int))[-2]; en más detalle.

    sizeof(int) nos da el tamaño en bytes del tipo de dato entero. En la mayoría de los sistemas, esto es 4 bytes. Entonces ptr se incrementa en 4 bytes, o el tamaño de un entero, usando el operador +=.

    ptr += sizeof(int);
    

    Esto significa que ptr ahora apunta a la ubicación de memoria del elemento en el índice 2 en arr.

    &arr[2]
    

    La parte final de la línea, [-2], accede al elemento en un desplazamiento de 2 elementos antes de la posición actual de ptr.

    (ptr += sizeof(int))[-2]
    

    Entonces, esta línea de código esencialmente accede al cuarto elemento del arreglo arr (&arr[3]) y apunta ptr1 a él.

Comments are closed.