2009-09-26 51 views
3

在Schaum的C++書籍中學習代碼,我看到很多使用char *,int *等的代碼。 做了練習,我還看到在解決方案中有char *,並且在我的代碼中我使用了char(沒有星)。在C++中char和char *有什麼區別?

我想知道一個char和一個指針char - integer和一個指針整數之間的區別是什麼?我應該在哪裏使用它們?他們的意思究竟是什麼?

+2

應該阻止人們回答? – 2009-09-26 20:52:41

+1

char *通常用於遍歷字符數組,即C字符串。與其他指針通常使用的方式不同,它很少用作指向單個字符的指針。 C++具有通常應該使用的更新的字符串結構。 – UncleO 2009-09-26 21:38:44

回答

6

帶有*的變量是指針。

「普通」變量(例如char或int)包含該數據類型本身的值 - 該變量可以包含一個字符或一個整數。

指針是一種特殊的變量;它不包含值本身,它包含內存中的值的地址。例如,char *不直接包含字符,但它包含計算機內存中某個字符的地址。

您可以通過使用&採取「正常」變量的地址:

char c = 'X'; 
char * ptr = &c; // ptr contains the address of variable c in memory 

而你通過指針使用*得到內存的值:

char k = *ptr; // get the value of the char that ptr is pointing to into k 

Pointer (computing)在維基百科。

+0

我知道什麼是指針 - 我想知道正常變量和指針之間的區別,以及爲什麼在某些情況下,我應該使用指針而不是普通變量。 – gujo 2009-09-26 19:32:11

+13

如果你知道指針是什麼,那麼你就知道它的區別。你明顯不這樣做。這並不那麼簡單,甚至在很長一段時間後,大「啊哈!」時刻到了。 – 2009-09-26 19:34:49

+2

如果你知道指針是什麼,並且你知道int或char是什麼,那麼你也知道int和int *或者char和char *之間的區別。如果你不知道它們之間的區別,那麼你不知道它們是什麼。 – jalf 2009-09-26 21:39:56

0

對於char或int,變量值是實際分配的值 - 「a」或42.對於char *或int *,變量值是存儲實際分配值的位置。因此,*表示變量指向存儲器中可找到值的位置。

2

指針指向特定變量的內存地址。起初有些人可能很難理解指針,關於它的更多信息請參見wikipedia

char *是一個指向內存中字符序列的指針,以'\ 0'結尾。一個字符代表一個字符。 int *將內存地址保存爲整數值。

實施例:

int* x = new int(); 

我們在堆上創建一個新的整數變量,並且在存儲器中的位置被保存在指針。指針現在指向整數所在的內存部分。如果我想使用的整數值的指針指向的話,我會叫:

int y = *x; 

這解引用的內存地址;它獲得指針後面的值。 y的值將成爲指針指向的內存後面的數據類型的值。

+0

我不得不買一本關於C語言的書,只是在指針上,但是一旦我理解了它們,C就變得易於編程了。 – 2009-09-26 19:24:46

5

您應該閱讀您書中解釋指針的第7章 - 您可能需要多個簡短的答案才能真正理解該主題。

1

當你有char或者int或者long或者類似的東西時,那麼內存將被留出來保存這個值,所以char是一個1字節的內存用於存儲。

該字節的地址是指針指向的地址。

當你有一個字符串或連續的char行時,這很有幫助,因爲你可以指向該字符串的開始,並將它傳遞給另一個函數,以便該函數可以使用字符串中的實際值。

所以,你用星號表示指針。

-1

帶*的變量是指針。這意味着它們包含一個內存地址,而沒有*的變量包含值。

所以一個字符包含一個字符值如'a'或'Z'。 char *指向一個內存區域,您可以通過char訪問值char。

int變量包含一個整數值,如1或12345. int *指向可以通過int訪問int值的內存區域。

對於所有其他類型都是如此。

實施例:

// pointer declaration 
char* pchar = new char[5]; 

此分配5 *的sizeof(char)的一個存儲器區和可以訪問5個字符。

當你的指針不再需要時,不要忘記釋放內存。

// pointer destruction 
delete pchar; 
+2

您的示例沒有分配5個字符的數組。它分配一個字符值爲5. – erikkallen 2009-09-26 20:55:04

+0

糟糕使用'()'而不是'[]'。感謝您將它指向我 – 2009-09-27 08:04:31

0

OK,

我會在這坐刺。 charchar*之間的區別是編譯器將變量放在您使用的內存中。

char c是一個堆棧聲明。容器保存您放入其中的數據的值,並應用堆棧範圍規則。當你擊中方法體的末尾時,c會「超出範圍」並自動清理。

char *c是一個指針變量。這意味着,變量不會保存您放入其中的數據的值,而是存儲在內存中的地址,通常稱爲「內存地址」。然後我們說c是「堆」,你,程序員負責清理它。所以當c超出範圍時不會自動清理,您需要調用delete來釋放內存。

*,是一元運算符,也被稱爲deferencing operator

這裏是一個很好的維基Dereference_operator

+1

指針不一定指向堆上的內存。有關指向堆棧內存的示例,請參閱Jesper的回答。 – Chuck 2009-09-26 20:33:28

0

char是一個值類型,因此引用該類型的變量得到一個字符。例如,

char ch = 'a'; 
cout << ch; // prints a 

char *是一個指向字符的指針,通常用於迭代字符串。例如,

char* s = "hello"; 
cout << s; // prints hello 
s++; 
cout << s; // prints ello 
相關問題