2009-06-28 33 views
69

Tôi muốn làm một cái gì đó có vẻ khá đơn giản. Tôi nhận được kết quả nhưng vấn đề là, tôi không có cách nào để biết nếu kết quả là chính xác.In địa chỉ một con trỏ chứa trong C

Tôi đang làm việc trong C và tôi có hai con trỏ; Tôi muốn in nội dung của con trỏ. Tôi không muốn dereference con trỏ để có được giá trị chỉ vào, tôi chỉ muốn địa chỉ mà con trỏ đã được lưu trữ.

Tôi đã viết mã sau đây và những gì tôi cần biết là nếu nó đúng và nếu không, làm thế nào tôi có thể sửa nó.

/* item one is a parameter and it comes in as: const void* item1 */ 
const Emp* emp1 = (const Emp*) item1; 

printf("\n comp1-> emp1 = %p; item1 = %p \n", emp1, item1); 

Trong khi tôi đăng bài này (và lý do điều quan trọng là đúng) là cuối cùng tôi cần làm điều này cho con trỏ tới con trỏ. Đó là:

const Emp** emp1 = (const Emp**) item1; 
+0

gì bạn đã viết là đúng, những vấn đề được bạn trải nghiệm một cách chính xác? –

+0

Như tôi đã mô tả, tôi đã nhận được kết quả nhưng không có cách nào để biết liệu kết quả có chính xác hay không hoặc nếu nó cho tôi rác. Don và những người khác bên dưới (cũng như chính bạn) đã xác nhận rằng những kết quả này là hợp lệ. –

Trả lời

24

Điều bạn có là chính xác. Tất nhiên, bạn sẽ thấy rằng emp1 và item1 có cùng giá trị con trỏ.

+1

Chúng sẽ không giống nhau nếu kiểu của item1 là một phần của đa thừa kế và/hoặc là tổ tiên của Emp, tùy thuộc vào cách trình biên dịch đưa ra từng lớp tạo ra kiểu của item1. –

+2

@Jim: Thẻ "C" đề xuất cách khác – Hasturkun

+1

@Jim: Hasturkun là đúng. Tôi đang làm việc ở C. Tôi nên đăng nó. –

34

Để in địa chỉ trong con trỏ đến con trỏ:

printf("%p",emp1) 

để dereference một lần và in địa chỉ thứ hai:

printf("%p",*emp1) 

Bạn luôn có thể xác minh với debugger, nếu bạn đang sử dụng Linux ddd và bộ nhớ hiển thị hoặc chỉ đơn giản là gdb, bạn sẽ thấy địa chỉ bộ nhớ để bạn có thể so sánh với các giá trị trong con trỏ của bạn.

+0

giống như trong mã Frank được đăng. –

+0

Tôi nghĩ anh ấy hỏi nó có đúng không ... – stefanB

8

Vì bạn đã dường như đã giải quyết được hiển thị địa chỉ con trỏ cơ bản, đây là cách bạn sẽ kiểm tra địa chỉ của một con trỏ kép:

char **a; 
char *b; 
char c = 'H'; 

b = &c; 
a = &b; 

Bạn sẽ có thể truy cập vào địa chỉ của con trỏ đôi a bởi đang làm:

printf("a points at this memory location: %p", a); 
printf("which points at this other memory location: %p", *a); 
+0

'printf (" chứa giá trị này:% c \ n "** a);' chỉ muốn thêm ^. ^. – RastaJedi

13

Tôi tin rằng điều này sẽ chính xác nhất.

printf("%p", (void *)emp1); 
printf("%p", (void *)*emp1); 

printf() là hàm variadic và phải được chuyển đối số đúng loại. Tiêu chuẩn cho biết %p mất void *.

+0

Tôi sẽ tưởng tượng chúng được quảng cáo? Không chắc chắn, ai đó có thể làm rõ? – RastaJedi

+2

Sau một số nghiên cứu, không, chúng không được quảng cáo tự động. Một diễn viên để 'void *' là thực sự cần thiết. – RastaJedi

0

Tôi đã ở vị trí này, đặc biệt là với phần cứng mới. Tôi đề nghị bạn viết một thói quen đổ rác nhỏ của riêng bạn. Bạn sẽ có thể xem dữ liệu và địa chỉ của chúng, được hiển thị cùng nhau. Đó là thực hành tốt và một người xây dựng sự tự tin.

+3

với chi phí nghe có vẻ ngu dốt - bạn có thể giải thích cách viết một thói quen như vậy không? –

+0

Ngoài ra câu trả lời này có thể phù hợp hơn làm nhận xét? – RastaJedi

3
char c = 'A'; 
printf("ptr: %p,\t value: %c,\t and also address: %zu",&c, c,&c); 

kết quả:

ptr: 0xbfb4027f, giá trị: A, và cũng có thể giải quyết vấn đề: 3216245375

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