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>
davy.ai
Explicación del código
Primero, vamos a entender qué hace el código.
char* arr[]
) con seis cadenas.función
con el arregloarr
como argumento.función
recibe un puntero a un puntero a un carácter (char **ptr
) como argumento.función
, se define un punterochar*
llamadoptr1
.ptr
se incrementa por el tamaño de un entero. Esto significa queptr
ahora apunta al tercer elemento del arregloarr
(&arr[2]
).[-2]
al final de la línea accede al elemento dos posiciones detrás de la posición actual deptr
. Esto significa queptr1
ahora apunta al cuarto elemento del arregloarr
(&arr[3]
).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. Entoncesptr
se incrementa en 4 bytes, o el tamaño de un entero, usando el operador+=
.Esto significa que
ptr
ahora apunta a la ubicación de memoria del elemento en el índice 2 enarr
.La parte final de la línea,
[-2]
, accede al elemento en un desplazamiento de 2 elementos antes de la posición actual deptr
.Entonces, esta línea de código esencialmente accede al cuarto elemento del arreglo
arr
(&arr[3]
) y apuntaptr1
a él.