Что необходимо для хранения адреса указателя?
int a = 2;
int *p = &a;
int **q = &p;
Любое практическое применение? Приложения реального времени.
Что необходимо для хранения адреса указателя?
int a = 2;
int *p = &a;
int **q = &p;
Любое практическое применение? Приложения реального времени.
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);
}
В 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.
Читайте также: Указатели на указатели Я просто нашел, чтобы рассказать вам пример.
Есть ли
int main (int argc, char** argv) { ... }
Посмотрите знакомый?
Если вы хотите выделить указатель N-го порядка в другой функции, вы должны использовать указатель (N + 1) -го порядка. Например:
void allocate_matrix(int ***ptr, int x, int y);
Позволяет выделить матрицу:
int **matrix:
allocate_matrix(&matrix, 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