2014-01-29 80 views
0

我知道它用於使用命令行參數,但我沒有得到聲明。 char * argv []?它是否意味着一個指向char數組的指針,如果是這樣,爲什麼沒有大小?如果它不是一個動態數組,你不必擁有一個大小嗎?char * argv []如何在c/C++中工作?

我已經做了一些研究,並遇到人們說它衰變爲char ** argv。這種衰變如何工作?

感謝您的幫助 - 對不起,作爲一個菜鳥的xD

+2

在發佈之前請使用'搜索'。互聯網,書籍,甚至stackoverflow已經有這個問題的答案。至少請看看[在此](http://stackoverflow.com/questions/3024197/what-does-int-argc-char-argv-mean)。 –

回答

0

的情況並不少見傳遞一個數組的指針數組和它的大小。如果你需要大小來傳遞指針,那麼這是不可能的。無論如何,只需要分配數組的大小。

0

您有尺寸; argc。雖然可以在函數簽名中使用該語法,但您不能真正將數組傳遞給C++中的函數。這是一個char**

0

命令行參數作爲數組傳遞。 C和C++中的數組只是一個連續的內存塊,它們不具有邊界檢查或聲明大小(如在Java .length和.NET .Length中所做的那樣)。

argv是一個指向字符串數組的指針。根據您使用的語法,這是char**char* argv[]argc是數組的大小。

因爲C/C++中的指針總是固定的大小,所以數組的大小始終爲argc個元素,或者sizeof(void*) * argc個字節。

在C(基本)字符串的數組/ C++實際上是char**因爲它的指針到一個空終止字符串的第一個字符的陣列,像這樣:

char** stringArray = &{ 
    0x1234, 
    0x4567, 
    0xABCD, 
} 
0x1234 = &"Some string\0"; 
0x4567 = &"Another string\0"; 
0xABCD = &"Third string\0"; 
0

「意思一個指向char數組的指針......?「

char* argv[];聲明一個字符串數組

char *類型的指針數組)「爲什麼沒有大小?」

由於尺寸可以變化,它不是固定的〜注意,這種類型的參數((char*)[])的相當於char**因爲數組衰變爲指針(這就是爲什麼一數組的大小不能被檢索的主要原因只是做一些像sizeof(argv)/sizeof(char*) - argv是一個指針)。這就是爲什麼參數計數(argv中元素的計數)以argc的形式傳遞給main的原因。

+0

要挑剔(sorta),您無法將數組傳遞給函數。如果你喜歡,你可以使用這種語法,但它仍然是一個'char **'。即使'char * argv [10]'也會高興地將一個不同大小的數組傳遞給函數。 –

+0

@EdS .: Decaying ...我知道,我知道...:D – LihO

+0

我想你知道,但是初學者對此有太多問題,我認爲這將很好地澄清 –

0

它是一個包含指向字符的指針的數組。

因此,argv [0]實際上是指向包含第一個參數(實際上是命令名)的字符的內存區域的指針。

在C中,數組沒有被檢查 - 沒有數組的隱式大小。在argv的情況下,你可以通過argc來告訴參數的個數。

要查找argv每個元素中各個參數的長度,可以使用字符串以空字符結尾的事實。

它衰減到char ** argv的語句是指C中數組和指針的近似等價。在大多數情況下,可以將數組變量作爲指向數組中第一個元素的指針。

雖然數組和指針之間有一些重要的區別,但是需要謹慎一些。更多深度見例如this article

+0

我覺得像這樣的工具在評論中很挑剔,但是...... *「因此,argv [0]實際上是一個指向數組的指針字符「 - - 不是。它是一個指向char('char *')的指針,而不是指向char數組的指針('char(*)[]') –

+0

Thanks @EdS。相應更新 – harmic

1

查看argv的最佳方式是指向字符/字符串的指針數組。每個argv[i]都指向一個以空字符結尾的字符串開頭的字符。

通過argc可以告訴您陣列中有多少個條目,但從技術角度來說這在argv[argc] == NULL之間是冗餘的,所以您有兩種方法來檢測參數列表的結束。

衰變的'事情'是,當你將一個數組傳遞給一個函數時,它被視爲指向數組的第一個元素的指針。

因此,如果您將int a[10]傳遞給函數,則值爲&a[0]並且是int *。在函數聲明或定義中,可以互換地編寫int *xint x[]。這與argv唯一的區別在於元素類型不是int而是char *,所以char *argv[]char **argv在函數的聲明或定義中是等效的。請注意,這種等價不適用於本地或全局變量。 extern char **v;extern char *a[];之間存在主要差異。