Besoin de pointeur à pointeur

Que faut-il pour stocker l’adresse d’un pointeur?

int a = 2; int *p = &a; int **q = &p; 

Toute utilisation pratique? Applications en temps réel.

Un ** est juste un pointeur sur un pointeur. Ainsi, lorsqu’un *p contient l’adresse d’un p , p** contient l’adresse d’un p* contenant l’adresse d’un object p .

** est utilisé lorsque vous souhaitez conserver l’atsortingbution de mémoire ou l’affectation même en dehors d’un appel de fonction .

Consultez également cet article .

EXEMPLE:-

 void allocate(int** p) { *p = (int*)malloc(sizeof(int)); } int main() { int* p = NULL; allocate(&p); *p = 1; free(p); } 

En C, vous pouvez soit passer “valeur” ou “adresse” d’un object. Si vous transmettez une valeur dans un appel de fonction, les modifications apscopes à la fonction ne sont pas répercutées sur le lieu de l’appel. Et pour refléter les changements, vous devez transmettre l’adresse de l’object, par exemple:

 void insert(node* head){ head->data = 10; // address(or head) is still same } 

Par object, je désigne tout type int, char ou struct, par exemple, node

Dans l’exemple ci-dessus, vous modifiez la valeur à l’adresse indiquée par le pointeur principal et les modifications des data sont reflétées.

Mais supposons que vous souhaitiez changer de head dans votre liste (par exemple, insérer un nouveau noeud en tant que premier noeud).

 void insert(node* head){ head = malloc(sizeof(head)); // head changed head->data = 10; } 

Alors, la valeur ne reflète pas le lieu d’appel car cette fonction head n’est pas identique à la head du lieu appelant.

Vous avez le choix entre deux options: return head ou utiliser un pointer to pointer (mais rappelez-vous qu’une seule valeur peut être renvoyée).

Utilisez pointeur à pointeur:

 void insert(node** head){ (*head) = malloc(sizeof **head); (*head)->data = 10; } 

Maintenant, les changements vont refléter!

Si l’adresse est votre valeur (besoin d’une adresse mise à jour), vous devez alors utiliser un pointeur d’adresse ou devrais-je dire pointeur à pointeur pour refléter les modifications apscopes au lieu de l’appel.

Si votre question porte sur ce qui est nécessaire pour le pointeur sur les pointeurs, un autre endroit où le pointeur sur le pointeur est utilisé dans un tableau de chaînes et les tableaux dynamics à deux dimensions. ou / tableau de caractères 3D .

Lisez aussi ceci: Pointeurs vers des pointeurs que je viens de trouver, pour vous donner un exemple.

Est-ce que

 int main (int argc, char** argv) { ... } 

Semble familier?

Si vous souhaitez affecter un pointeur d’ordre N dans une autre fonction, vous devez utiliser le pointeur d’ordre (N + 1). Par exemple:

 void allocate_masortingx(int ***ptr, int x, int y); 

Permet d’allouer une masortingce:

 int **masortingx: allocate_masortingx(&masortingx, 5, 5); 

L’une des utilisations possibles est de changer la valeur d’un pointeur depuis une fonction. Par exemple:

 #include  void swapSsortingngs(const char **strA, const char **strB) { const char *tmp = *strB; *strB = *strA; *strA = tmp; } int main() { const char *a; const char *b; a = "hello"; b = "world"; swapSsortingngs(&a,&b); // now b points to "hello" and a points to "world" printf("%s\n", a); printf("%s\n", b); } 

Les sorties:

 world hello