2013-11-03 81 views
0

我的老師給了我一個練習的更正,它包含使用雙指針的代碼。由於我對C相當陌生,因此很難理解代碼的作用。我知道單個指針的基礎知識,但不知何故,我在雙指針路由上迷失了方向。難以理解這段代碼如何工作(雙指針)

代碼:

#include <stdio.h> 

main(int argc, char** argv){ 
    printf("\nHello "); 
    char** runner = argv; 
    ++runner; 
    while(*(runner+2) != 0){ 
     **runner = toupper(**runner);  
     printf("%s, ",*runner);   
     ++runner; 
    } 

    **runner = toupper(**runner); 
    printf("%s ",*runner);  
    ++runner; 
    **runner = toupper(**runner); 
    printf("and %s!",*runner); 
} 

-The第一個問題我已經是理解爲什麼main函數使用了雙指針? - 第二個問題,初始化雙指針,跑步者後,它被告知指向一個地方。但是,如果它指向一個指針,而指針又指向一個你不知道的地方,你究竟怎麼知道它指向哪裏?

  • 由於我有問題了解這兩件事情,我無法繼續,也不知道代碼如何進一步工作。

謝謝您的時間

+1

哦,男孩怎麼寫這樣的代碼?我想我理解它,但它很安靜。 – rekire

+0

這很簡單:'argv'是一個指針數組的指針,每個指針指向命令行參數的第一個字符。 – musicmatze

+0

跑步者增加跳過第一個char *字符串,這通常是程序本身的一個路徑(雖然它可以是任意的,但蠕蟲可以) –

回答

3

讓我們試着去解釋它:

main(int argc, char** argv){ 

正常的主要功能只是存在的返回類型缺失可能導致問題。 (c90 vs c99 AFIK)。第一個參數是大於1的參數計數(因爲第一個參數是二進制名稱(對busybox等多個通話應用程序有幫助))。第二個參數是作爲字符串又名char-array的參數,它用於調用該二進制文件的shell。

printf("\nHello "); 
char** runner = argv; 
++runner; 

打印出你好與跳過二進制的第一個參數(這是二進制名稱)

while(*(runner+2) != 0){ 

檢查如果當前參數的第三個字節是一個空字節。恕我直言,這可能會導致問題,如果沒有第二個參數。

**runner = toupper(**runner); 

將其轉換爲大寫。

printf("%s, ",*runner); 

打印出該參數

++runner; 

跳轉到下一個參數。

} 
**runner = toupper(**runner); 
printf("%s ",*runner);  
++runner; 
**runner = toupper(**runner); 
printf("and %s!",*runner); 

幾乎相同的循環只是需要其中涉及2個字節的參數之後,接下來的兩個參數。

+0

'** runner = toupper(** runner)'只使第一個字符大寫。 – cyphar

+0

如果在第4行,++'用'(* runner)++;'替換'會不會更好? ?既然你實際上想要它指向的指針移動一個字節? 或者它直接指向數組而不是間接? – BURNS

0

爲什麼主函數使用雙指針?

主函數接收2個參數:傳遞給命令行的參數數(argc表示參數count)和包含參數的數組。

一個參數是一個字符串,所以它是一個char* C.你有一個字符串數組,所以argv的類型是char**

第二個問題,在初始化雙指針runner之後,它被告知指向更遠的一個地方。但是,如果它指向一個指針,而指針又指向一個你不知道的地方,你究竟怎麼知道它指向哪裏?

runner指向與argv指出的相同的數組。但現在當你做++runner時,它會指向參數數組中的下一個元素。在C中,第一個字符串實際上是命令的名稱,因此runner現在指向在命令行中傳遞的第一個參數。

0

我沒有運行你的代碼,但我可以給你一些爲什麼使用雙指針的內部。

Argv持有論點。 Argv [0]是程序名,argv [1]是第一個參數,等等。所以這就是爲什麼「++ runner」首先增加以訪問第一個參數。

在這種情況下,雙指針允許您通過輕鬆增加索引位置在內存中,然後當您到達那裏時,您訪問您的數據,而這恰好是另一個char *。

1

當一個指針數組傳遞給一個函數時,它會「衰減」到一個指向指針的指針。這正是mainargv發生的情況:它是指向char的指針。有時,main聲明被寫成等效

int main(int argc, char *argv[]) 

更明確的有關傳遞指針數組。

隨着發生了什麼事情的理解,就不難看出,

char** runner = argv; 
++runner; 

在邏輯上是相同的:

char** runner = &argv[1]; 

筆者簡單地跳過的main初始參數,直接從指數1開始。