2014-12-17 22 views
5

Nếu có con trỏ trong C (char * tên []) và con trỏ đến con trỏ (char ** cur_name = name); Có thể có một con trỏ đến một con trỏ đến một con trỏ không?Có thể có con trỏ tới con trỏ tới con trỏ không?

Hoặc là con trỏ trỏ đến con trỏ trỏ tới một danh sách được liên kết? Có lẽ đó là một câu hỏi ngu ngốc, nhưng tôi muốn biết câu trả lời.

+0

Rút ngắn tiêu đề. Và có, 3 cấp độ của con trỏ được hỗ trợ. Trong thực tế, [nhiều cấp độ có thể] (http://www.stackoverflow.com/questions/10087113/how-many-levels-of-pointers-can-we-have) –

+0

Câu hỏi này đã được hỏi! Kiểm tra [this] (http://stackoverflow.com/questions/22002248/double-and-triple-pointers-in-c) thread! –

+2

Một con trỏ và một danh sách liên kết là hai điều hoàn toàn khác nhau. –

Trả lời

5

Có, bạn có thể có số lượng con trỏ tùy ý.

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

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

Một con trỏ đến một con trỏ đến một con trỏ là không một danh sách liên kết. Một danh sách liên kết là một loại cấu trúc có chứa một con trỏ đến kiểu riêng của mình:

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

Vì vậy mà bạn có thể chuỗi chúng lại với nhau trong một danh sách:

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

Và lặp qua chúng:

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

Nhưng op là đúng, truy cập elenent thứ n của một danh sách liên kết và dereferencing n cấp độ của một con trỏ là (phía sau màn cửa) điều rất giống nhau (modulo một số số học con trỏ). – Witiko

3

Hãy đặt nó theo các thuật ngữ đơn giản hơn.

Khai báo biến - không quan trọng loại nào - và nó đại diện cho một vị trí trong bộ nhớ.

int foo=1; 

Sau đó bạn có thể khai báo một biến trỏ đến rằng biến.

int *bar; 
bar = &foo; 

Mở rộng nó một lần nữa - khai báo một con trỏ đến rằng biến ... và vân vân.

Vấn đề là không có giới hạn về mức độ bất định mà bất kỳ con trỏ nào có thể được sử dụng hoặc khai báo. Và, cú pháp, bạn có thể làm

int ****nthLevelPointer; 

Bây giờ, giữ theo dõi đó trong mã trong một ai đó theo cách khác có thể phải duy trì là một vấn đề hoàn toàn :)

+0

Cảm ơn bạn, điều đó có ý nghĩa rất nhiều về mặt khái niệm. Tôi tự hỏi, mặc dù, khi bạn tạo một con trỏ đến một con trỏ như trong ví dụ của bạn int * baz ... sẽ không cú pháp được ** baz; trái ngược với * baz? Tôi bối rối khi sử dụng hai ngôi sao thay vì một ngôi sao. – TheSilverBanger

3

Một ví dụ đơn giản:

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 ; 

cho thấy rằng không có giới hạn lý thuyết về độ sâu hướng đến con trỏ.

0

Câu trả lời ngắn: Con trỏ trỏ đến địa chỉ trong bộ nhớ, có thể tự giữ nhiều con trỏ hơn. Giới hạn là số lượng địa chỉ có sẵn.

Câu trả lời ngắn hơn: Có, có thể có con trỏ trỏ con trỏ.

1

Câu trả lời của bạn là có. con trỏ chỉ là tham chiếu đến bộ nhớ. Nếu chúng ta có thể tham chiếu đến bộ nhớ, chúng ta cũng có thể tham chiếu đến con trỏ. bạn có thể nhận được chúng kích thước, trong đống process.you của bạn có thể định nghĩa chúng bằng biến cục bộ.giả schema này:

con trỏ một -----> con trỏ b -----> con trỏ c ------> (biến cục bộ hoặc xác định biến trong đống)

0

Một con trỏ tới một con trỏ tới con trỏ là có thể.

nếu bạn declarate một biến như thế này:

int ***ptr; 

thì:

-> 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 

do đó:

highest pointer level: ptr 
    ...     *ptr 
    ...    **ptr 
int variable   ***ptr 
Các vấn đề liên quan