2015-09-05 91 views
3

我明白爲什麼這不起作用:關於指針數組爲char

int main(int argc, char *argv[]) { 
    char *names[] = {"name1", "name2", "name3", "name4"}; 
    int i = 0; 
    while (i++ <= 3) { 
     printf("%s\n", *names++); 
    } 
} 

錯誤:

a.c: In function 'main': 
a.c:16: error: wrong type argument to increment 
shell returned 1 

這是因爲我想增加一個數組變量(而不是指針)。請不要介意錯誤消息中的行號,我有很多評論代碼,上面和下面是我在這裏提出的。

不過,我不明白爲什麼這段代碼的工作:

void myfunc(char *names[]) { 
    int i = 0; 
    while (i++ <= 3) { 
     printf("%s\n", *names++); 
    } 
} 


int main(int argc, char *argv[]) { 
    char *names[] = {"name1", "name2", "name3", "name4"}; 
    myfunc(names); 
} 

我們怎樣才能增加在myfunc()names?它仍然是一個局部數組變量,在myfunc()。 有人可以幫忙嗎?

謝謝。

+3

在第二種情況下,它衰減爲指針並且指針可以增加。 – ameyCU

+0

你聲明你知道第一個例子的問題的根源。那麼,你是否明白代碼需要以'#include '語句作爲前綴?如果編譯時啓用了所有的警告,編譯器會告訴你有關1)警告:未使用的argc參數2)警告:未使用的argv參數3)錯誤:作爲增量運算符需要左值。如果你解決了這些問題,代碼就可以正常工作。 – user3629249

回答

5

在1 st示例names是一個數組。數組不能增加

在2 nd示例names是一個指針。指針可以增加

背景爲何2 第二示例編譯:

在函數聲明的變量定義中的[]是一樣的(另一個)*

所以這

void myfunc(char * names[]); 

相當於

void myfunc(char ** names); 

後者使得它很明顯,這裏names不是一個數組而是一個指針。

1

當您將一個數組作爲函數參數傳遞時,它會將其轉換爲指向數組中第一個元素的指針。這意味着當你聲明一個數組並試圖直接增加數組時,你試圖增加一個數組。另一方面,當您將數組作爲參數傳遞時,它會作爲指針傳遞,因此您可以將其增加。

如果您希望將數組作爲數組傳遞而不是指針,那麼可以考慮使用std::array,它是一個固定大小的容器。

編輯:我道歉。 std::array僅在C++中可用。

+0

你可以在C中使用'std :: array'嗎? – ameyCU

+0

沒有抱歉。我以爲你是用C++編寫的。我不知道如何在C中傳遞一個數組作爲數組。 –

+0

不要道歉,我只是這樣做,所以OP沒有感到困惑。 – ameyCU

1

當您將數組傳遞給函數時,它會衰減爲指針。 請參閱此處瞭解有關array-decaying