2010-08-20 75 views
3
/*1*/ const char *const letter = 'A'; 

/*2*/ const char *const letter = "Stack Overflow"; 

爲什麼1無效,但2有效?字符,指針,表演和字符串問題

字母是需要分配地址的指針。引用的字符串地址是?我假設這是爲什麼#2有效,並且單引號字符串不被視爲地址?

而且,就是這兩種鑄造類型之間的差異?:

static_cast<>()

最後,如果var是一個char變量,爲什麼清點< < & VAR < <出來亂碼?爲什麼我必須拋棄它*?

感謝您耐心等待初學者的提問。

+0

http://stackoverflow.com/questions/332030/when-should-static-cast-dynamic-cast-and-reinterpret-cast-be-used – Anycorn 2010-08-20 06:47:11

+0

謝謝編譯下面的輸出如圖你爲那個鏈接。 – ShrimpCrackers 2010-08-20 06:54:04

回答

8

因爲'A'不是指針,所以如果底層字符集是ASCII,則它是char,65或41 。

"Stack",在另一方面,是字符串,基本上字符數組{'S', 't', 'a', 'c', 'k', '\0'},這降低到指針到其第一個字符。

您的「static_cast()之間的差異」已被回答here,遠遠超過我的能力。

爲什麼你的垃圾帶char var = 'x'; cout << &var ...的原因是因爲&varchar *這意味着它被視爲一個字符串 - 在這種情況下,cout輸出字符到最後空字符\0這是不存在的,或者是超越角色。下面的代碼顯示了這一點:

#include <iostream> 
int main() { 
    //int q1 = 0; 
    char xx = 'x'; 
    //int q2 = 0; 
    std::cout << &xx << std::endl; 
    return 0; 
} 

輸出:

x~Í" 

當你取消註釋q線,它的工作原理,因爲它把周圍的字符零,自身的輸出x)。請記住,這不是猶太教的C,它只是因爲我的堆棧組織的方式而工作。不要使用這是真實的代碼。

+0

謝謝。這就說得通了。 – ShrimpCrackers 2010-08-20 06:55:34

0

首先一個就是具有價值A一個char類型..也沒有單引號的字符串只是單引號字符..

而第二個是一個array of characters,因此它的工作原理..

char letter [] = { 'H', 'e', 'l', 'l', 'o', '\0' }; 
char letter [] = "Hello"; 

兩者都爲letter指定了相同的初始化方法。

0

對於你的第二個問題,這link將是有用的。

+0

這應該是一個評論。 – sbi 2010-08-20 07:03:11

+0

Opps。將照顧它。 – user001 2010-08-20 08:30:40

0

在這種情況下,'A'只是一個值(可能是'65')。每當C看到單引號中的內容時,就認爲它正在處理單個字符。因此,你基本上說,指針'字母'將指向內存地址爲65的任何內容。 。可能不是你要做什麼,所以編譯器將它標記爲錯誤。另一方面,當你分配一個字符串(「A」)時,編譯器會在幕後執行一些魔術以使其工作。它接受該字符串並將其放置到可執行文件的某個位置,然後每次使用該特定字符串時,都會將它所知道的字符串的內存地址替換爲已放入程序的文字。另外,static_cast(value)優於(type)值,因爲static_cast <>()往往會對它做什麼有更多的限制(所以在編譯時會捕獲更多的錯誤)。這也是更詳細的(例如,有的const_cast(值),這將一個值轉換,從一個const(不變)的東西,可以通過你的代碼進行修改。

HTH

+0

你已經很好地解釋過了,但是每次使用特定的字符串時,它會用它所知道的字符串的內存地址替換你已經輸入到程序中的字符串:「Q只做了這一次將該地址複製到一個指針中,之後使用該字符串,但「魔術」不會持續涉及。 – 2010-08-20 07:48:06

0

你可以看到一個char作爲整數類型(如int但短),所以當你寫char l = 'A';,您只需登錄的A數字ASCII值的變量l

當你寫char* letters = "foo",得到的事情將是類似於以下

char letters[4]; 
letters[0] = 'f'; 
... 
letters[3] = '\0'; 
+0

除了數組和指針不是同一個東西... – fredoverflow 2010-08-20 07:20:05

+0

所以工作「相似」......並且分配將是相同的,並且這個數組會衰變爲一個指針...... – 2010-08-20 07:45:02

0

我通常遵循的一種方式是使用typeid運算符來理解我正在處理的類型。

通過type_info :: name返回一個實現定義的字符串,它通常是很多次安靜的自我解釋來理解我們正在處理的內容。當用gcc

#include <iostream> 
#include <typeinfo> 
using namespace std; 

int main(){ 
    cout << typeid('A').name() << endl;      // prints 'c' meaning char 
    cout << typeid("Stack Overflow").name() << endl;   // prints 'A15_c' meaning 
                  // array of 15 characters 
}