2015-10-20 118 views
-1

我有一個指針的地址有問題。轉換指針的地址字符串和分配字符串ADRESS爲指針?

類:

class name{ 
public: 
    name(); 

} 

我想要得到的名稱類的指針的地址,並將其轉換爲字符串

name* p=new name(); 
const char* add=(const char*)&p; 
printf("%s \n",add); // input is ������� . how to transfer add to string to use printf("%s \n",add) and result is 0xbfa0f108 ?? 
printf("%p \n",add); //input is 0xbfa0f108 


name *q; 
q= add; // i want to assign the address of q to point to p. indirect via add. 

如何我需要做什麼?我是一個新的C++;

+1

你的問題是沒有意義的。爲什麼你需要首先將'name *'指針間接轉換爲'char *'?無法使用'%s'打印它,只能用'%p'打印。如果沒有醜陋的類型轉換,你就不能把它分配給'q',例如:'q = *((name **)add);'。你真的想完成什麼?這聽起來像[XY問題](http://mywiki.wooledge.org/XyProblem)。 –

+0

請澄清你的問題。你想打印指針嗎? –

+0

真正的問題:我想獲取C中的一個對象的地址並將地址傳遞給Lua,然後我將地址返回給C.我需要將地址指針轉換爲字符串以便輕鬆地傳遞給Lua。 – nguyenmy

回答

0

如果你想打印指針的地址只是使用&。

變化:

printf("%s \n",add); 

到:

printf("%p \n",&add); 

或更好地利用COUT //因爲這個問題被標記到C++

cout<<&add; 

我想要分配的地址q指向p。間接通過添加。

以及你不能做:

q = add; // name * and const char ** are different pointer types. 

您可以將q作爲參考被它鑄造的名字添加*

q= (name *) &add; // not a good practice 
cout<<q<<endl; 

這不是鑄造爲const char一個很好的做法*這是因爲:

爲const char是一個指針,誰的價值也可以改變,使得p 。oints包含char類型的值不能改變位置*

1

爲了得到一個指針名稱類的地址的字符串,你只寫:

name* p = new name(); // pointer to name class 
const char* add = reinterpret_cast<const char*>(&p); 
std::string str = add; 

你可以以幾種方式檢索對象的地址:

type* pntr = &object; 

在上面的示例中,pntr現在是對象的地址。該&符號,在語句的右側使用時,指定要的地址。當在語句的左手側使用時,&指定到另一對象的引用:

type& ref = object; 

在這個例子中,參考現在是對象的引用。設定參考等於另一個值將設置對象相等的值。

當你有一個指針,你想要的那個指針指向,只需使用*符號取消引用指針對象:

type* pntr = &object; // pntr is the address pointing to object 
std::cout << *pntr << std::endl; // dereferences pntr to retrieve object 

像@vishal說,Q =添加會拋出一個錯誤因爲您正在將一個常量字符*分配給名稱*。您不能直接將一種類型的指針指派給另一種類型的指針。此外,拋出const不被認爲是不好的做法,但是你必須絕對確定你知道你在做什麼。但是,在C++中使用C風格轉換被認爲是不好的做法。如果你想投,你應該使用下列之一:

static_cast<type*>(pointerToSomeOtherType); 
reinterpret_cast<type*>(pointerToSomeOtherType); 
const_cast<type*>(pointerToSomeOtherType); 
dynamic_cast<type*>(pointerToSomeOtherType); 

(type*) pointerToSomeOtherType; 
+0

不行q =(name *)&add;不會拋出任何錯誤,q會得到add的地址,您可以通過cout << q; – vishal

+0

@vishal我的壞!我錯過了&。另一個說明,當我使用實際類型時,q =(char *)爲我添加編譯。我認爲編譯器會拋出一個錯誤,如果你試圖拋棄const而不使用const_cast ...爲什麼不在這種情況下? –

+0

@ Alexander Bolinsky:真正的問題:我正在使用Lua腳本,並且我在C+++中創建了一個對象,我想將對象的地址傳遞給Lua,並將Lua中的地址放回到C++中。我應該那樣做嗎?我不知道如何將對象傳遞給Lua,並將該對象從Lua傳回給C++。 – nguyenmy