2014-12-17 44 views
5

Jeśli istnieją wskaźniki w C (char * names []) i wskaźniki do wskaźników (char ** cur_name = names); Czy może istnieć wskaźnik do wskaźnika do wskaźnika?Czy istnieje wskaźnik do wskaźnika do wskaźnika?

Albo czy wskaźnik do wskaźnika do wskaźnika jest tylko połączoną listą? Może to głupie pytanie, ale chciałbym poznać odpowiedź.

+0

skrócić tytuł. I tak, obsługiwane są 3 poziomy wskaźników. W rzeczywistości [wiele poziomów jest możliwych] (http://www.stackoverflow.com/questions/10087113/how-many-level-of-pointers-can-we-have) –

+0

To pytanie zostało już zadane! Sprawdź wątek [this] (http://stackoverflow.com/questions/22002248/double-and-triple-pointers-in-c)! –

+2

Wskaźnik i połączona lista to dwie zupełnie różne rzeczy. –

Odpowiedz

5

Tak, możesz mieć dowolną liczbę poziomów wskaźników.

int x = 5; 
int *a = &x; 
int **b = &a; 
int ***c = &b; 

printf("%d %d %d %d\n", x, *a, **b, ***c); 

Wskaźnik do wskaźnika do wskaźnika jest nie połączonej listy. Połączony lista to rodzaj struktury, która zawiera wskaźnik do własnego typu:

struct list 
{ 
    int data; 
    struct list *next; 
}; 

Tak, że można łańcucha je razem w formie listy:

struct list three = { 3, NULL }; 
struct list two = { 2, &three }; 
struct list one = { 1, &two }; 
struct list head = { 0, &one }; 

I iteracyjne nad nimi:

for (struct list *node = &head; node->next; node = node->next) 
{ 
    printf("%d\n", node->data); 
} 
+0

Ale operacja ma rację, dostęp do n-tej elenentu połączonej listy i dereferencji n poziomów wskaźnika to (za zasłonami) to samo (modulo jakiś wskaźnik arytmetyczny). – Witiko

3

Ujmijmy to w prostszy sposób.

Zadeklaruj zmienną - nie ma znaczenia, jaki typ - i reprezentuje lokalizację w pamięci.

int foo=1; 

Następnie można zadeklarować innej zmiennej, która wskazuje na że zmienną.

int *bar; 
bar = &foo; 

Rozszerz go ponownie - zadeklarować wskaźnik do że zmienna ... i tak dalej.

int *baz; 
baz = &bar; 

Chodzi o to, że nie ma ograniczeń co do poziomu pośredniego, do którego można użyć lub zadeklarować dowolny wskaźnik. I składniowo, można zrobić

int ****nthLevelPointer; 

Teraz, utrzymując utwór się, że w kodzie w sposób ktoś inny może mieć do utrzymania jest zupełnie inna sprawa :)

+0

Dziękuję, to ma sens w sensie koncepcyjnym. Zastanawiam się jednak, kiedy utworzysz wskaźnik do wskaźnika, tak jak w twoim przykładzie int * baz ... nie byłoby składni ** baz; w przeciwieństwie do * baz? Nie wiem, kiedy użyć dwóch gwiazdek zamiast jednej. – TheSilverBanger

3

Prosty przykład:

struct List 
{ 
    struct List* next ; 
} 

struct List a ; 
struct List* p = &a ; 
p->next = p ; 
p = p->next ; 
p = p->next->next ; 
p = p->next->next->next ; 
p = p->next->next->next->next ; 
p = p->next->next->next->next->next ; 
p = p->next->next->, ... ,next->next->next ; 

pokazuje, że teoretyczny limit wskazania głębokości nie jest teoretyczny.

0

Krótka odpowiedź: Wskaźniki wskazują adresy w pamięci, które mogą zawierać więcej wskaźników. Limit to liczba dostępnych adresów.

Krótsza odpowiedź: Tak, może istnieć wskaźnik-wskaźnik-wskaźnik.

1

Twoja odpowiedź brzmi: tak. wskaźniki są po prostu odwołaniami do memory.so jeśli możemy odwołać się do pamięci możemy odwołać się do wskaźnika. możesz uzyskać ich rozmiar, w stosie procesu. Możesz także zdefiniować je za pomocą zmiennej lokalnej.Zakładamy schematem:

wskaźnik -----> wskaźnik b -----> wskaźnik c ------> (zmiennej lokalnej lub określenie zmiennej w stosie)

0

wskaźnik do wskaźnik do wskaźnika jest możliwy.

jeśli declarate zmienną takiego:

int ***ptr; 

następnie:

-> ptr will be a pointer to a pointer to a pointer to an int variable 
-> *ptr will be a pointer to a pointer to an int variable 
-> **ptr will be a pointer to an int variable 
-> ***ptr will be a int variable 

Dlatego:

highest pointer level: ptr 
    ...     *ptr 
    ...    **ptr 
int variable   ***ptr 
Powiązane problemy