Необходимость указателя на указатель

Что необходимо для хранения адреса указателя?

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

Любое практическое применение? Приложения реального времени.

Ответ 1

A ** - это просто указатель на указатель. Итак, где *p содержит адрес p, p** содержит адрес p*, который содержит адрес объекта p.

** используется, если вы хотите сохранить выделение памяти или присвоение даже вне вызова функции.

Также проверьте эту статью .

Пример: -

void allocate(int** p)
{
  *p = (int*)malloc(sizeof(int));
}

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

Ответ 2

В C вы можете либо передать "значение", либо "адрес" объекта. Если вы передадите значение в вызове функции, изменения, внесенные в функцию, не отразятся на месте вызова. И чтобы отразить изменения, вам необходимо передать адрес объекта, например:

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

По объекту я означает любой тип int, char или struct, например. node

В приведенном выше примере вы изменяете значение при адресе указателя head, а изменение в data будет отражено.

Но предположим, что вы хотите изменить head себя в свой список (например, вставьте новый node как первый node).

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

Тогда значение не отражается на месте вызова, потому что эта функция head не совпадает с head в месте вызова.

У вас есть два варианта: return head или использовать pointer to pointer (но помните, что только одно значение может быть возвращено).

Использовать указатель на указатель:

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

Теперь изменения отразятся!

Дело в том, что если адрес является вашим значением (необходимо обновить адрес), тогда вам нужно использовать указатель адреса, или я должен указать указатель на указатель, чтобы отражать изменения в вызывающем месте.

Как ваш вопрос заключается в необходимости указателя на указатели, еще одно место, где указатель на указатель, используемый в массиве строки, и динамические 2-D массивы, и для такого же использования вам может понадобиться указатель на указатель на указатель, например динамическая матрица массива String или /3D char.

Читайте также: Указатели на указатели Я просто нашел, чтобы рассказать вам пример.

Ответ 3

Есть ли

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

Посмотрите знакомый?

Ответ 4

Если вы хотите выделить указатель N-го порядка в другой функции, вы должны использовать указатель (N + 1) -го порядка. Например:

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

Позволяет выделить матрицу:

int **matrix:
allocate_matrix(&matrix, 5, 5);

Ответ 5

Для этого нужно изменить значение указателя внутри функции. Например:

#include <stdio.h>

void swapStrings(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";
    swapStrings(&a,&b);
    // now b points to "hello" and a points to "world"
    printf("%s\n", a);
    printf("%s\n", b);
}

Выходы:

world
hello