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.

¿No debería la desreferenciación de un puntero proporcionar el valor dentro de la dirección a la que se está haciendo referencia?

Mi código aquí básicamente implica un puntero a una matriz unidimensional de 3 enteros, sólo que no entiendo la salida para la línea de código ‘printf (“El valor en la dirección B[0] es: %d\n”, *B);’. ¿No debería proporcionarme el valor en la dirección en la que está apuntando el puntero B al desreferenciarlo? ¿Hay algo mal con mi declaración? Gracias, la salida no me dio el valor en su lugar me dio la dirección :’)).

“`
#include<stdio.h>
#include<stdlib.h>

int main(void){
int B[2][3] = {{2,3,4},{5,6,7}};
int (<em>p)[3] = B;
printf("La dirección en B[0] es: %d o %d\n", B, &B[0]);
printf("El valor en la dirección B[0] es: %d\n", *B); /</em>cuando desreferencio el puntero B aquí, ¿no debería darme el valor, por qué cuando ejecuto el código, todavía me da la dirección?*/
printf("B + 1 = %d\n", B+1);
}
“`</stdlib.h></stdio.h>

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El problema con la declaración printf ("El valor en la dirección B[0] es: %d\n",*B) es que solo está apuntando al primer elemento de la primera fila del arreglo 2D B. Esto se debe a que B se declara inicialmente como un arreglo 2D con dimensiones de 2×3. Cuando asignamos la dirección del primer renglón de B al puntero p, se convierte en un arreglo 1D de 3 enteros (por eso se declara como int (*p)[3]).

    Para imprimir los valores de los elementos en B, necesitamos usar ciclos anidados para iterar por todas las filas y columnas del arreglo. Aquí hay un ejemplo:

    #include <stdio.h>
    #include <stdlib.h>
    
    int main (void){
        int B[2][3] = {{2,3,4},{5,6,7}};
        int (*p)[3] = B;
        printf("La dirección en B[0] es: %p o %p\n", B, &B[0]);
        printf("El valor en la dirección B[0][0] es: %d\n", *(*p)); // imprime 2
        for (int i = 0; i < 2; i++) {
            for (int j = 0; j < 3; j++) {
                printf("B[%d][%d] = %d\n", i, j, *(*(p+i)+j));
            }
        }
        printf("B + 1 = %p\n", B+1); // imprime la dirección de la segunda fila, es decir, &B[1]
    }
    

    Este código imprimirá todos los elementos en B, así como el valor de la dirección B+1, que es la dirección de la segunda fila del arreglo 2D. La salida debería verse así:

    La dirección en B[0] es: 0x7ffc225132c0 o 0x7ffc225132c0
    El valor en la dirección B[0][0] es: 2
    B[0][0] = 2
    B[0][1] = 3
    B[0][2] = 4
    B[1][0] = 5
    B[1][1] = 6
    B[1][2] = 7
    B + 1 = 0x7ffc225132cc
    

    Tenga en cuenta que estoy usando el especificador %p para imprimir direcciones, así como la sintaxis *(*(p+i)+j)) para acceder a los elementos en el arreglo 2D a través del puntero.</stdlib.h></stdio.h>

Comments are closed.