2015-07-04 43 views
-5
  1. 爲什麼它是p+=*string[2]-*string[1]而不是p+=string[2]-string[1](不含星號)?如何使用C中的字符串和指針?

  2. res[0]=*p;它的值是'c'爲什麼?爲什麼p在單詞字母上移動,而*string[1]在單詞間而不是字母間移動?

    #####我編輯了代碼.........做了「char * p = string;」可以替換爲「char p = * string [0];」?

代碼的輸出是

Ç

int main (void) 
{ 
    char* strings[]={"abcdb","bbb","dddd"}; 
    char*p=*strings; 
    char res[2]; 
    p+=*string[2]-*string[1]; 
    res[0]=*p; 
    p+=3; 
    res[1]=*p; 
    printf("%s\n",res); 
    return 0; 
} 
+0

'string'定義在哪裏?這是'字符串'的錯字錯誤嗎?請注意,代碼應該打印「cb」而不是「c」,但由於「res」是未終止的字符串,因此您有未定義的行爲。 –

+1

@lucky該程序具有未定義的行爲,其原因不是Weather Vane指出的。原因是你試圖將指針解引用超過字符串字面值「abc」這就是這個語句res [1] = * p;已經無效。 –

+1

@VladfromMoscow您的意思是*除了我寫的內容,還是我對未終止字符串的評論是錯誤的? –

回答

1

第一件事情是有沒有像string在你的程序中定義的,所以你的說法應該是p+=*strings[2]-*strings[1]

回答對你的問題是提領ap ointer。您需要了解指針如何在Strings上工作。請檢查this link

2

程序有未定義的行爲。

我們不會考慮到存在拼寫錯誤,而不是標識符strings有時使用標識符string。我們假設代碼片段中的每個地方都使用標識符strings

在此語句

char*p=*strings; 

數組的第一元素被分配給指針。數組的第一個元素是指向字符串文字​​的第一個字符的指針。所以p指向字符串文字'a'

在此語句

p += *strings[2] - *strings[1]; 

strings[2]是具有陣列型char *的第三元件,並將其值是字符串文字"dddd"的第一個字符的地址。解引用該指針*strings[2]你將得到這個字符串的第一個字符字面即'd'

strings[1]是具有陣列型char *的第二元件,它的值是字符串文字"bbb"的第一個字符的地址。解引用該指針*strings[1]你將得到這個字符串的第一個字符是`「B」

字符'd''b' (for example in ASCII the code of character「B」的內部代碼之間的差is 98 while the code of「D'`100)等於2。

所以這種說法

p += *strings[2]-*strings[1]; 

由2.增加了指針起初,它指向的第一個字符串字面​​的性格'a'和增加2後,現在指向同一個字符串字面​​的性格'c'

因此,在此聲明

res[0] = *p; 

字符'c'被分配到res[0]

這種說法

p+=3; 

p值變爲無效,因爲它現在指向超出字符串「ABC」,這是沒有必要的編譯器放置字符串字面"bbb"字符串字面​​後正好經過。

所以在接下來的發言

res[1]=*p; 

結果不確定的行爲間接引用這個指針。

按照C標準

如果結果點的一個過去的數組對象的最後一個元素,它 不應被用作一元的操作數*操作符是 評價

它只是發生這樣一種方式,編譯器將字符串文字一個接一個地放在內存中。雖然這不是標準保證的。

所以,如果語句後

res[1]=*p; 

資源[1]不包含字符'\0'那麼接下來聲明

printf("%s\n",res); 

也有不確定的行爲。

+0

如果他已經將字符串聲明爲char字符串[] [5] = {「abc」,「bbb」,「dddd」}; 。將「bbb」存儲在「abc」之後是否需要? –

+0

@Sourav Kanta陣列是連續的記憶範圍。在這種情況下,保證「bbb」完全存儲在「abc」之後。他們之間有兩個零字符。 –