2012-04-02 42 views
6

có phải là cách duy nhất nhận được địa chỉ của một địa chỉ trong C (đối diện dereference đôi để có một biến trung gianC địa chỉ của một địa chỉ của một biến

ví dụ như tôi đã:

int a; 
int b; 
int *ptr_a; 
int *ptr_b; 
int **ptr_ptr_a; 

a = 1; 
ptr_a = &a; 
ptr_ptr_a = &(&a); <- compiler says no 
ptr_ptr_a = &&a;  <- still compiler says no 
ptr__ptr_a = &ptr_a; <- ok but needs intermediate variable 

nhưng bạn có thể làm ngược lại, ví dụ:

b = **ptr_ptr_a;  <- no intermediate variable required 

ví dụ như tôi không cần phải làm:

ptr_b = *ptr_ptr_b; 
b = *ptr_b; 

tại sao hai toán tử không đối xứng trong chức năng của chúng?

+1

Vì con trỏ phải trỏ vào một số bộ nhớ. do đó, 'ptr_a = & a' có nghĩa là ptr_a trỏ trên a. nhưng, '&& a' -> không có 'con trỏ' trên đó con trỏ có thể trỏ. ptr_a là một số bộ nhớ trên ngăn xếp, vì vậy bạn có thể chỉ vào nó. – nothrow

+0

Không có lý do gì để làm phức tạp mọi thứ: 'int * ptr_ptr_a = &ptr_a;' là tốt. – karlphillip

+0

tất nhiên - có ý nghĩa sau khi bạn đã chỉ ra điều đó - rất cám ơn – bph

Trả lời

11

Toán tử địa chỉ trả về một giá trị và bạn không thể lấy địa chỉ của một giá trị (xem here để giải thích sự khác biệt giữa giá trị và giá trị).

Vì vậy, bạn phải chuyển đổi nó thành một giá trị bằng cách lưu trữ nó trong một biến, sau đó bạn có thể lấy địa chỉ của biến đó.

+2

Vâng, đó là chính xác nhưng nếu OP hỏi câu hỏi này thì RValues ​​có thể là một khái niệm khá tiên tiến ... – Roddy

+0

@Roddy, true, tôi đã thêm một liên kết đến bài viết MSDN giải thích những khái niệm này. –

1

địa chỉ của địa chỉ của một cái gì đó là không thể, bởi vì một địa chỉ của địa chỉ sẽ là mơ hồ

Bạn có thể lấy địa chỉ của một cái gì đó mà giữ địa chỉ của một cái gì đó, và bạn có thể có nhiều lần xuất hiện của đó (với khác nhau giá trị)

1

Không có địa chỉ nào như địa chỉ. Bạn có một hộp, với một số trên đó. Đó là số lượng ô trong chuỗi bộ nhớ. Không có nơi nào lưu trữ những con số này. Điều này cũng sẽ rất đệ quy như bạn có thể thấy.

1

Nếu bạn nghĩ trong giây lát, bạn sẽ nhận thấy rằng để lấy địa chỉ của thứ gì đó, nó phải nằm trong bộ nhớ.

Nếu bạn có một biến

int a 

nó có một địa chỉ. Nhưng địa chỉ này là, nếu nghi ngờ, hư không trong bộ nhớ, vì vậy nó không cần phải có một địa chỉ. IOW, bạn chỉ có thể lấy địa chỉ của một biến.

Theo một hướng khác, mọi thứ trở nên dễ dàng hơn. Nếu bạn có địa chỉ của một cái gì đó, bạn có thể dereference nó. Và nếu điều này "cái gì" là một con trỏ, bạn có thể dereference nó một lần nữa. Vì vậy, các đề cập đến đôi indirection ở trên được tự động đưa ra.

1

Nói một cách đơn giản, chỉ những thứ được giữ trong bộ nhớ máy tính mới có thể có địa chỉ. Chỉ cần yêu cầu địa chỉ của một cái gì đó không có nghĩa là địa chỉ được lưu trữ trong bộ nhớ.

Khi bạn có con trỏ trung gian, bạn hiện đang lưu trữ nó trong bộ nhớ và lấy địa chỉ nơi lưu trữ.

3

Khi bạn yêu cầu địa chỉ bằng cách sử dụng '&', bạn sẽ hỏi địa chỉ của một thứ được lưu trữ trong bộ nhớ. Sử dụng '&' 2 lần có nghĩa là bạn muốn nhận địa chỉ của địa chỉ không có ý nghĩa.

Bằng cách này, nếu bạn sử dụng biến trung gian khi bạn đang thực hiện, bạn sẽ nhận được địa chỉ của biến trung gian. Điều đó có nghĩa là nếu bạn sử dụng 2 biến trung gian để so sánh các địa chỉ, chúng sẽ khác nhau. ví dụ::

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

// for now &p and &q are different 

if (&p == &q) 
    printf("Anormal situation"); 
else 
    print("Ok"); 
+0

Câu trả lời này là đáng ngờ, '" plop "' không phải là một biến nhưng '&" plop "' là hợp lệ. – ouah

4

Nó có lẽ là dễ dàng hơn để giải thích với một bố trí bộ nhớ ví dụ như thế này:

Var  Adr value 
--------------------- 
a   1000  1 
ptr_a  1004 1000 
ptr_ptr_a 1008 1004 
               1008  1004  1008->1004->1000 
You can obviously dereference ptr_ptr_a twice *ptr_ptr == ptr_a, **ptr_ptr_a == 1 

Nhưng biến a có một địa chỉ (1000) những gì cần giải quyết của một địa chỉ có ý nghĩa nếu nó không phải là địa chỉ của một con trỏ? &a là trạm cuối cùng. Do đó &&a sẽ không có ý nghĩa gì cả.

Các vấn đề liên quan