2010-04-23 47 views
14

Đặt con trỏ đến int, làm cách nào để có được int thực tế?Cách chuyển đổi int * thành int

Tôi không biết điều này có khả thi hay không, nhưng ai đó có thể vui lòng cho tôi biết?

+3

Bạn nói rằng bạn không chắc liệu điều đó có thể thực hiện được hay không. Hãy xem xét: Nếu điều đó là không thể, thì việc sử dụng con trỏ là gì? –

+1

bị thừa nhận đó là câu hỏi về vấn đề naft – paultop6

Trả lời

36

Sử dụng * trên con trỏ để có được những biến chỉ (dereferencing).

int val = 42; 
int* pVal = &val; 

int k = *pVal; // k == 42 

Nếu con trỏ trỏ tới mảng, thì hội nghị sẽ cho bạn phần tử đầu tiên của mảng.

Nếu bạn muốn "giá trị" của con trỏ, đó là địa chỉ bộ nhớ thực tế con trỏ chứa, sau đó quăng nó (nhưng nó thường không phải là một ý tưởng tốt):

int pValValue = reinterpret_cast<int>(pVal); 
+0

Ví dụ an toàn hơn so với jimka – Toji

+0

Không chắc chắn nếu static_cast là đúng cho câu cuối cùng, thay đổi thành reinterpret_cast ... – Klaim

+1

Có phải 'int' là một loại tốt để truyền con trỏ tới? Không phải '#include ' và 'uintptr_t' có thể di động hơn không? – ndim

4

sử dụng toán tử tham chiếu * ví dụ

void do_something(int *j) { 
    int k = *j; //assign the value j is pointing to , to k 
    ... 
} 
+0

Điều này không trả lời được câu hỏi. – Danvil

+3

Int * j đã được chuyển thành int k. Điều đó dường như trả lời câu hỏi. – CiscoIPPhone

1

Sử dụng * để dereference sự con trỏ:

int* pointer = ...//initialize the pointer with a valid address 
int value = *pointer; //either read the value at that address 
*pointer = value;//or write the new value 
+0

Điều này không trả lời câu hỏi. – Danvil

+0

Tại sao d/v trả lời này? –

+0

Yeap, tôi cũng không hiểu. – sharptooth

5

tôi không chắc chắn 100% nếu tôi hiểu những gì bạn muốn:

int a=5;   // a holds 5 
int* ptr_a = &a; // pointing to variable a (that is holding 5) 
int b = *ptr_a; // means: declare an int b and set b's 
       // value to the value that is held by the cell ptr_a points to 
int ptr_v = (int)ptr_a; // means: take the contents of ptr_a (i.e. an adress) and 
         // interpret it as an integer 

Hop e điều này sẽ giúp.

+0

+1 để đề cập đến cast – Vlad

+0

Đây là C++, bạn nên tránh phôi kiểu C. –

+0

Tại sao? Dàn diễn viên kiểu C là một phần của ngôn ngữ. Tại sao chính xác nên tránh chúng? – rxantos

2

Bạn nên phân biệt đúng những gì bạn muốn: truyền hoặc dereference?

int x = 5; 
    int* p = &x; // pointer points to a location. 
    int a = *p;  // dereference, a == 5 
    int b = (int)p; //cast, b == ...some big number, which is the memory location where x is stored. 

Bạn vẫn có thể gán int trực tiếp đến một con trỏ, chỉ cần không chỉ tới đích nó, trừ khi bạn thực sự biết những gì bạn đang làm.

int* p = (int*) 5; 
    int a = *p;  // crash/segfault, you are not authorized to read that mem location. 
    int b = (int)p; // now b==5 

Bạn có thể làm mà không có dàn diễn viên rõ ràng (int), (int*), nhưng nhiều khả năng bạn sẽ nhận được cảnh báo trình biên dịch.

7

Nếu bạn cần lấy giá trị được trỏ tới bởi con trỏ, thì đó không phải là chuyển đổi. Bạn chỉ cần dereference con trỏ và kéo ra các dữ liệu:

int* p = get_int_ptr(); 
int val = *p; 

Nhưng nếu bạn thực sự cần phải chuyển đổi con trỏ đến một int, sau đó bạn cần phải cast. Nếu bạn nghĩ rằng đây là những gì bạn muốn, hãy suy nghĩ lại. Có lẽ là không. Nếu bạn đã viết mã yêu cầu cấu trúc này, thì bạn cần phải suy nghĩ về một thiết kế lại, bởi vì điều này là không an toàn. Tuy nhiên:

int* p = get_int_ptr(); 
int val = reinterpret_cast<int>(p); 
+0

+1 để đề cập rõ ràng rằng không có chuyển đổi nào đang diễn ra. –

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