Что необходимо для хранения адреса указателя?Необходимость указателя на указатель
int a = 2;
int *p = &a;
int **q = &p;
Любое практическое применение? Приложения реального времени.
Что необходимо для хранения адреса указателя?Необходимость указателя на указатель
int a = 2;
int *p = &a;
int **q = &p;
Любое практическое применение? Приложения реального времени.
A **
- это просто указатель на указатель. Поэтому, где *p
содержит адрес p
, p**
содержит адрес p*
, который содержит адрес объекта p
.
**
**
используется, если вы хотите сохранить выделение или назначение памяти даже вне функции вызова.
Также проверьте это article.
Пример: -
void allocate(int** p)
{
*p = (int*)malloc(sizeof(int));
}
int main()
{
int* p = NULL;
allocate(&p);
*p = 1;
free(p);
}
Не думаю, что он спрашивает, что это такое. –
@Rahul Tripathi: Он говорит о практическом использовании ?? –
Только что обновил мой ответ. Надеюсь, это имеет смысл. !! :) –
Одно из применений этого заключается в том, чтобы изменить значение указателя из функции. Например:
#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
wayne, U может использовать realloc для увеличения выделенной памяти. –
Rahul, В какой ситуации нам нужно сохранить память вне вызова функции. –
И без переустановки исходных значений. – cHao
В C вы можете либо передать "значение" или "адрес" объекта. Если вы передадите значение в вызове функции, изменения, внесенные в функцию, не отразятся на месте вызова. И, чтобы отразить изменения, вам нужно передать адрес объекта, например:
void insert(node* head){
head->data = 10; // address(or head) is still same
}
По объекту I означает любой тип INT, символ или структуры например node
В приведенном выше примере вы измените значение в адресе head
и измените его на data
.
Но предположим, что вы хотите изменить в своем списке head
(например, вставить новый узел в качестве первого узла).
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;
}
Теперь изменения будут отражать!
Дело в том, что если адрес является вашим значением (необходимо обновить адрес), то вам нужно использовать указатель адреса, или я должен указать указатель на указатель, чтобы отражать изменения в вызывающем месте.
Как ваш вопрос, что нужно указателей на указатели, еще одно место, где указатель на указатель используется в array of string и dynamic 2-D arrays, и для такого же использования может потребоваться указатель на указатель на указатель, например dynamic matrix of String or/ 3D char array.
Читайте также: Pointers to Pointers Я просто нашел, чтобы рассказать вам пример.
Cauhan: +1. Отличный ответ. Практически в списке ссылок я использовал то же самое. –
Это точно отвечает на то, что было задано, его единственным аспектом его использования все же +1 :) – 0decimal0
@pranitkothari да! Я использовал оба, но я использую заголовок возврата, чтобы избежать сложных выражений указателя, но двойной указатель делает код немного малым. –
Если вы хотите выделить указатель N-го порядка в другой функции, вы должны использовать указатель (N + 1) -го порядка. Например:
void allocate_matrix(int ***ptr, int x, int y);
позволяет нам выделить матрицу:
int **matrix:
allocate_matrix(&matrix, 5, 5);
ли
int main (int argc, char** argv) { ... }
Посмотрите знакомые?
да, я думаю, что наиболее частое место нам нужно указатель на указатель, + для публикации очень широко полезного примера. –
Ответ, который вы ищете, находится здесь http://www.codeproject.com/Articles/4894/Pointer-to-Pointer-and-Reference-to-Pointer. –
Термин «двойной указатель» вводит в заблуждение, пожалуйста, измените его на указатель на указатель :) – 0decimal0
Теперь почему это приостановлено? Это не плохой вопрос. –