2013-08-19 4 views
9

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

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

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

+0

Ответ, который вы ищете, находится здесь http://www.codeproject.com/Articles/4894/Pointer-to-Pointer-and-Reference-to-Pointer. –

+5

Термин «двойной указатель» вводит в заблуждение, пожалуйста, измените его на указатель на указатель :) – 0decimal0

+1

Теперь почему это приостановлено? Это не плохой вопрос. –

ответ

9

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); 
} 
+2

Не думаю, что он спрашивает, что это такое. –

+0

@Rahul Tripathi: Он говорит о практическом использовании ?? –

+0

Только что обновил мой ответ. Надеюсь, это имеет смысл. !! :) –

1

Одно из применений этого заключается в том, чтобы изменить значение указателя из функции. Например:

#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 
+1

wayne, U может использовать realloc для увеличения выделенной памяти. –

+0

Rahul, В какой ситуации нам нужно сохранить память вне вызова функции. –

+0

И без переустановки исходных значений. – cHao

22

В 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 Я просто нашел, чтобы рассказать вам пример.

+1

Cauhan: +1. Отличный ответ. Практически в списке ссылок я использовал то же самое. –

+1

Это точно отвечает на то, что было задано, его единственным аспектом его использования все же +1 :) – 0decimal0

+0

@pranitkothari да! Я использовал оба, но я использую заголовок возврата, чтобы избежать сложных выражений указателя, но двойной указатель делает код немного малым. –

3

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

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

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

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

ли

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

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

+1

да, я думаю, что наиболее частое место нам нужно указатель на указатель, + для публикации очень широко полезного примера. –