2016-01-21 29 views
0

我正在學習C++,我似乎無法找到一個好的解釋是char * argv []的工作原理。我知道這是一個字符數組,但從我的理解,如果你有爲什麼argv [1]是整個單詞而不是單個字母?

char myword[] = "Hello"; 

然後myword [1]是「e」。

所以當使用argv []時,爲什麼argv [1]是整個第一個參數,而不僅僅是程序名的第二個字母?這裏有一些我不明白,但我不知道什麼....

感謝您的任何解釋!

回答

1

你似乎錯過argv(包含在int main(int argc, char* argv[]))點是一個指針指向char的指針,而不是char。

關於數組和指針的一些有趣的東西。由於一個指針可以被視爲一個數組(只要它指向一個數組),並且數組可以被當作指針(技術術語爲衰減到指針),因此數組和指針通常可以可交互地使用。

但是,當這樣做時,仍然需要記住在某些時候,數組和指針之間存在明顯差異。最明顯的(不是唯一的一個!)是它們尺寸的差異。

例如:

char argv[] = "Test!"; 
char* pargv = argv; 

size_t s_argv = sizeof(argv); // equals to 6 - 5 letters of Test! + \0 
size_t s_pargv = sizeof(pargv); // equals to whatver size of pointer you have, i.e. 4 or 8 
+0

爲了迂迴,'argv'是一個指針。但它總是指向一個指針數組 - 它總是指向字符數組。 – user2079303

+0

啊哈!這就說得通了!謝謝! – Matt

+0

@ user2079303,我的確同意這一點,並且我實際上已經考慮過這樣的措辭,但是OP會更好地理解'數組'。 – SergeyA

0

因爲argv是指向char s的指針,而myword只是一個指針。 mywordchar*類型,而argvchar**類型。

+1

其實'myword'根本不是'char *'。實際上,它是一個char [6]' – user2079303

+0

@ user2079303無論何時開始在陣列上操作,它都會轉換爲指針。 –

+0

取決於你如何操作它,但是,在很多情況下,數組會衰減到一個指針。 – user2079303

0

因爲argv(假設你的意思是聲明爲main()參數之一)是

char* argv[] 
//^

,而不是

char argv[] 
-2

char* argv[]是雙陣列(或任何你想將它命名),同爲char** argv。在argv[0]處的對象將是另一個char*,argv[0][0]將是char

+2

不,'argv [0]'處的對象不是數組,而是'char *'。 – SergeyA

0

argv的基本上是這樣的:那麼在左邊

enter image description here

是參數本身 - 什麼實際作爲參數傳遞main。這是一個指針數組的地址。每個指向內存中的某個位置的文件都包含在命令行中傳遞的相應參數的文本。然後,在該數組的末尾保證有一個空指針。

注意,對於個人的實際參數存儲在至少可能相互獨立分配,使它們在內存中的地址可能是相當隨機排列(但取決於事情如何發生的寫入,他們可以也在一塊連續的記憶中 - 你根本不知道或不應該在意)。

+1

出於好奇 - 你爲什麼重新排列第三和第二個參數,使圖片複雜化? – SergeyA

+4

@SergeyA:爲了強調每一個都至少在理論上分開分配的事實,並且你不能指望它們在內存中遵循任何特定的順序。 –

+0

我明白了。順便說一下,我更喜歡新的安排。 – SergeyA

0

我明白[argv]是字符

的陣列它不是。它甚至不是一個數組。

C++中沒有數組參數,請參閱C++ arrays as function argumentsPassing Arrays to Function in C++。如果在參數聲明中使用T[]T[N]語法,則實際上意味着T*。因此, argv是一個指向指針數組的指針。這些指針指向字符數組。

相關問題