2012-04-14 51 views
2

我想了解指針遞增和提領走在一起,我也該嘗試一下:指針增量和間接引用(左值所需錯誤)

#include <stdio.h> 
int main(int argc, char *argv[]) 
{ 
    char *words[] = {"word1","word2"}; 
    printf("%p\n",words); 
    printf("%s\n",*words++); 
    printf("%p\n",words); 
    return 0; 
} 

我希望這個代碼做這些中的一個:

  1. 首先解除引用然後增加指針(印刷WORD1)
  2. 首先解除引用然後增加值(印刷ord1)
  3. 解除引用PO間+ 1(打印單詞2)

但是編譯器甚至不會編譯這一點,並給出了此錯誤:lvalue required as increment operand我在這裏幹什麼什麼了嗎?

回答

2

你不能增加一個數組,但你可以增加一個指針。如果轉換聲明一個指針數組,你會得到它的工作:

#include <stdio.h> 
int main(int argc, char *argv[]) 
{ 
    const char *ww[] = {"word1","word2"}; 
    const char **words = ww; 
    printf("%p\n",words); 
    printf("%s\n",*words++); 
    printf("%p\n",words); 
    return 0; 
} 
+0

我想的char *字[]和char **的話是一回事。 – yasar 2012-04-14 02:24:31

+0

@ yasar11732不,他們是不同的類型。該'字符*字[]'*衰減*爲'字符**如果你把它傳遞給一個函數,否則它們是不同的words'。 – dasblinkenlight 2012-04-14 02:28:11

2

你需要把括號圍繞指針引用的第二個printf,例如:printf("%s\n",(*words)++);另外,如果你試圖在你的列表中得到2號在那裏,你需要使用前綴增量,而不是後綴。

+0

我給你+1,但它可能有助於解釋優先發布,或者至少指向一個說明它的來源。 – jpm 2012-04-14 02:17:35

1

words是數組的名字,所以++使得它沒有任何意義。你可以把一個指向數組元素,但:

for (char ** p = words; p != words + 2; ++p) 
{ 
    printf("Address: %p, value: '%s'\n", (void*)(p), *p); 
} 

相反2的你當然可以用更通用sizeof(words)/sizeof(*words)

0

問題是這一行:

printf("%s\n",*words++); 

它讀作*(words++),即增量的塊記憶。這是沒有意義的,這是一個有點像試圖做:

int a = 1; 
(&a)++; // move a so that it points to the next address 

這是C.

的問題是由C數組和指針的區別造成非法的:(基本上)陣列是一個內存塊(在編譯時分配),而一個指針是指向的內存塊(不一定在編譯時分配的)。這是一個共同斷路式用C時,並且對SO關於它(例如C: differences between char pointer and array)其他問題。

(此修復程序在其他的答案中描述,但基本上你想用一個指針指向字符串,而不是字符串數組。)