2012-04-24 19 views
3

考慮一個簡單的例子printf如何顯示char *中的字符串?

Eg: const char* letter = "hi how r u"; 

信是一個const字符指針,它指向字符串「嗨如何[R U」。現在,當我想要打印數據或訪問數據時,我應該使用*letter正確嗎?

但是在這種情況下,我不應該只在調用printf時使用地址嗎?

printf("%s",letter); 

那麼爲什麼會這樣呢?

回答

7

*letter實際上是一個字符;這是letter指向的第一個字符。如果你對字符的整個字符串操作,然後按照慣例,功能將着眼於該字符,然後下一個,等等,直到他們看到一個零(「\ 0」)字節。一般來說,如果你有一個指向一堆元素(即一個數組)的指針,那麼這個指針指向第一個元素,並且不知何故在這些元素上運行的任何代碼都需要知道有多少個元素。對於char*,存在零約定;對於其他類型的數組,您通常必須將該長度作爲另一個參數傳遞。

1

只是因爲printf有這樣的簽名:int printf(const char* format, ...);這意味着它期望指向char表的指針,它將在內部解引用。

+0

好吧,可變參數的類型從簽名中不明顯,但重點是內部它是一個char *,而不是char。 – teukkam 2012-04-24 13:33:14

1

字母並不是指向整個字符串,而是指向字符串的第一個字符,因此是一個char指針。

當您取消引用指針(使用*)時,您指的是字符串的第一個字符。但是單個字符對prinf(當打印字符串時)有很大的用處,所以它取而代之的是指向第一個元素的指針,並增加它的值,打印出解引用值直到找到空字符'\ 0'。

由於這是一個C++的問題同樣重要的是要注意,你應該存儲字符串作爲安全encapulated類型std::string和你的類型安全的輸入輸出流在可能的情況:

std::string line="hi how r u"; 
std::cout << line << std::endl; 
1

printf("%s")預計地址爲了通過內存搜索NULL\0)=字符串的結尾。在這種情況下,你只說letter。到printf("%c")預計值不是地址:printf("%c", *letter);

1

printf將指針指向數據數組作爲參數。因此,如果您顯示的字符串(數組類型)爲%s%d%e,%f等的數字,請始終傳遞變量名稱而不要使用*。變量名稱指向數組的第一個元素的指針,並且printf將根據類型(char是1或2字節,int s是4等)使用簡單指針算術打印數組的每個元素,直到它達到EOL或零值。

當然,如果你製作一個指針這個數組變量,那麼你會想要用*取消引用那個指針。但這更多的是例外情況。 :)