2016-08-05 160 views
1

我需要澄清一下關於C++中指針初始化基礎知識的概念。根據我的理解,在使用指針輸入一些值之前,必須爲指針分配一個地址。在C++中初始化指針

int *p; 
*p=10; //inappropriate 
cout << *p <<"\n"; 

這可能會顯示正確的輸出(10),但這可能會導致更大的程序問題,因爲p最初有它可以是任何東西&以後可以在程序中作爲well.So其他地方使用的垃圾地址,我相信這是incorrrect,正確的方法是:

int *p; 
int x=10; 
p=&x; //appropriate 
cout << *p <<"\n"; 

我的問題是,如果上面的理解是正確的,那麼也同樣對char *申請以及?:

const char *str="hello"; // inappropriate 
cout << str << "\n"; 
//OR 
const string str1= "hello"; 
const char str2[6] ="world"; 
const char *str=str1; //appropriate 
const char *st=str2; //appropriate 
cout << str << st << "\n"; 

請指教

+1

char *等價於int * p; * p = 10;'會是'char * s; * s ='h';',不是你寫的內容 –

+0

僅供參考您可以手動將地址分配給指針(請參閱[這裏](http://stackoverflow.com/a/4532074/1559401))。在你的情況下,如果你有一個地址'10',你可以做'int * p =(int *)10'。你可以進一步顯示這裏[這裏](http://stackoverflow.com/a/32631614/1559401)。在嵌入式系統上工作時,尤其是在爲微控制器編寫代碼時,這特別有用。 – rbaleksandar

回答

5

您對字符串的理解不正確。

讓我們例如第一行:

const char *str="hello"; 

這實際上是正確。像"hello"這樣的字符串文字被編譯器變成了一個常量數組,像所有數組一樣,它可以衰減爲指向其第一個元素的指針。所以你在做什麼是使str指向數組的第一個字符。

然後讓繼續

const string str1= "hello"; 
const char *str=str1; 

這其實是不對的。 A std::string對象沒有定義鑄造到const char *的鑄造操作員。編譯器會給你一個錯誤。您需要使用c_str函數獲取指向包含字符串的指針。

最後:

const char str2[6] ="world"; 
const char *st=str2; //appropriate 

在聲明和初始化str這比第一行真的沒有什麼不同。正如你所說,這是「恰當的」。


關於使用「不恰當的」指針第一個例子:

int *p; 
*p=10; //inappropriate 
cout << *p <<"\n"; 

這不僅是「不恰當的」,這導致undefined behavior,反而可能崩潰程序。另外,正確的術語是p的值是不確定

+0

感謝您的回答!我知道char * str =「hello」會導致str指向'h'。但我的問題就像你說的整數和其他數據類型指針,我們需要先分配一些地址,然後再分配目標值給它。像int * p; * p = 10 - 這是錯誤的,但char * str =「hello」是正確的。但在這種情況下,爲什麼它不會導致問題,因爲我們也直接分配目標值而沒有任何地址? – Ashu

+0

@Ashu在C++中,像「」hello「這樣的字符串文字是一個常量」char「的數組。該數組由編譯器創建並存儲在某個地方(不相關的地方),其生命週期與程序運行一樣長。與所有使用它的數組一樣,它會衰減到指向其第一個元素的指針。基本上這就是當你做'const char * str =「hello;」'時發生的事情 –

1

當我宣佈一個指針

int *p; 

我得到一個對象p其值地址。沒有int s在任何地方創建。你需要做的是將p認爲是是地址而不是int

此時,這並不是特別有用,因爲除nullptr之外,您沒有可以分配的地址。那麼,從技術上說,這不是真的:p本身有一個地址,你可以用&p得到的地址,並將其存儲在int**,甚至做一些可怕的事情,如p = reinterpret_cast<int*>(&p);,但讓我們忽略它。

要用ints做點什麼,你需要創建一個。例如如果你去申報

int x; 

你現在有一個int對象,它的值是整數,我們可以再與p = &x;其地址分配給p,然後通過*pp恢復對象。


現在,C風格的字符串有奇怪的語義—怪異的方面是是c 實際上並沒有在所有字符串:它總是與char陣列工作。

字符串文字,像"Hello!",都保證(動作像他們)作爲位於一些地址const char陣列存在,並且用C的奇轉換規則,該陣列將自動轉換爲一個指針到它的第一元件。因此,

const char *str = "hello"; 

在該字符數組中存儲h字符的地址。聲明

const char str2[6] ="world"; 

工作原理不同;這個(像它一樣行動)創建一個全新的數組,並將字符串文字"world"的內容複製到新數組中。

順便說一句,這裏有一個過時的和棄用的功能來兼容傳統程序,但是由於一些誤導的原因,人們仍然在新程序中使用它,所以你應該知道它並且它是錯誤的:你被允許打破類型系統和實際編寫

char *str = "hello"; 

這不應該工作,因爲"hello"const char一個數組,但該標準允許此具體使用。但是,您仍然不允許修改數組的內容。


1:由「彷彿」的規則,程序只需要表現彷彿的事情發生,因爲我形容,但如果你偷看的彙編代碼,實際的方式事情發生可以很不同。