2016-07-31 58 views
0
int main() 
    { 
     char *name="Shakib Al Hasan"; 
     printf("My name is %s\r\n",name) ; 

     return 0; 
    } 

這些代碼很好地工作。我們都知道一個指針應該在使用前指向另一個相同數據類型的變量。但是在這種情況下,沒有其他變量被聲明和賦值。我的問題是它是如何工作的?指針如何直接分配給字符串而不指向任何變量?

+2

'char * name'是一個指針變量,它已經用字符串文字的地址初始化了。然後傳遞給'printf'。 –

+0

請勿使用'「\ r \ n」'。如果您的平臺使用這些字節作爲換行符,則打印'「\ n」'應該同時輸出。 – aschepler

+0

常量字符串位於可執行映像中的常量地址處。變量'name'被設置爲指向該地址的值。 –

回答

2

字符串文字就好像您有一個static const字符數組。實際的數組由編譯器創建。所以,你的代碼幾乎等同於

int main() 
{ 
    static const char name_literal[] = "Shakib Al Hasan"; 
    char *name= (char*) name_literal; 
    printf("My name is %s\r\n",name) ; 

    return 0; 
} 

(一個細微的差別:你沒有得到一個保證name_literal是從所有其它對象不同的地址。)

+0

骯髒,骯髒...... :-) - 前方危險:http://stackoverflow.com/documentation/c/364/undefined-behavior/13573/modifying-a-const-variable-using-a-pointer#t= 201607311720402219155 – alk

1

正如我們都知道指針應指向相同的數據類型的另一個變量使用

正確的前...

...但請注意,指針並不意味着指向變量的指針。

實際上,一個指針指向一個包含相同類型數據(即與指針相同類型)的內存位置。

因此,這裏name,這是一個指針,指向一個只讀存儲器位置的包含字符串"Shakib Al Hasan"的起始地址(本質上是一個char數組)。並且使用%s格式說明符並傳遞該指針的起始地址name來打印它。

0

當您保存指向字符串的指針時,請將字符串放入「隨機存儲器地址」中。 含義與我從亞馬遜訂購書籍時相同。 我請他們把我的家送到亞馬遜網站服務網站。 我必須來我家,直接從送貨員那裏取貨。 所以,我離開我的家庭地址在亞馬遜網站服務 這只是一個內存地址。

char * string = "hello";這是一個例子。 這不會給送貨員帶來「hello」的直接含義。 所以我給「字符串」是「hello」的「隨機存儲器地址」中的一個字符串變量。

  • 所有變量都是在程序執行期間指定的一個隨機地址存儲器。這不僅僅是程序員看不見的。
  • 指定大小以字節爲單位的內存空間使用的所有變量。

事實上,我並不完美,而且我還在學習過程中。 我的信息也不是100%完美。 如果我的答案中有錯誤或翻譯不正確,請給我點評。

+0

我的解釋是錯誤的,然後給我評論! –

+0

「我不完美,我是一個學習過程」如果你是自己的話,那應該是我不完美,而且我正在學習過程中。 –

+0

我的英語語法並不完美。感謝評論! :) –

相關問題