J'ai du mal à créer un pointeur vers le pointeur sur le tas. Voici mon code:

double a = 2.289;

double** ptr = (double*) malloc(sizeof(double*));
double*** ptr_to_ptr = (double*) malloc(sizeof(double*));

Je veux que la variable ptr garde l'adresse de a et ptr_to_prt l'adresse de ptr. Comment puis-je ensuite déréférencer les valeurs. Je veux faire quelque chose comme ça:

printf("%lf", **ptr_to_ptr);

Thx à l'avance

c
-1
STUDENTS PETROSCHOOL 24 oct. 2020 à 17:35

2 réponses

Meilleure réponse

Cela montre comment pointer et vérifier les adresses du pointeur sur la pile

#include <stdio.h>

int main(){
    double X = 2.25;
    double* pX = &X;
    double** ppX = &pX;

    printf("Addr X:   %8X\n", &X);
    printf("Addr pX:  %8X\n", &pX);
    printf("Addr ppX: %8X\n", &ppX);
    printf("Val X: %f", **ppX);
}

Et cela montre comment pointer et afficher les adresses sur le tas

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

int main(){
    double X = 2.25;
    double** pX = (double**) malloc(sizeof(double**));
    double*** ppX = (double***) malloc(sizeof(double***));

    *pX = &X;
    *ppX = &*pX;

    printf("Addr X:   %8X\n", &X);
    printf("Addr pX:  %8X\n", &*pX);
    printf("Addr ppX: %8X\n", &*ppX);
    printf("Val X: %f", ***ppX);
}

Vous obtiendrez un espace dans le tas et y stockerez l'adresse, vous aurez donc besoin d'un pointeur sur un pointeur juste pour enregistrer l'adresse de 'X'

Modifier 1:

Pour une meilleure réponse au commentaire, je mets le code ici

Ci-dessous le code montre l'utilisation et l'opérateur

L'opérateur '&' obtient juste l'adresse de la variable, donc * & obtient la valeur de l'adresse de cette variable

Regardez maintenant la valeur de jeu de code bot de x ci-dessous et les deux sont corrects

#include <stdio.h>

int main(){
    int X;

    *&X = 10;
    printf("X: %d\n", X);

    X = 20;
    printf("X: %d\n", X);
}
1
Ali Mirghasemi 24 oct. 2020 à 16:11

Vous avez besoin d'un astérisque supplémentaire pour avoir le bon type:

double a = 2.289;
double** ptr = (double**) malloc(sizeof(double*));
double*** ptr_to_ptr = (double***) malloc(sizeof(double**));

Pour déréférencer, vous aurez besoin d'autant d'astérisques que de niveaux que vous voulez descendre. Voir l'exemple:

int x = 5;
int *p = &x;
int **p2 = &p;

printf("%p %p\n",*p2, p); //If you use 1 asterisk you get to p
printf("%d", **p2); // If you use 2 asterisks you get what p points to, which is an int in this case
 
0
vmp 24 oct. 2020 à 14:48