2010-10-30 51 views
9

我恰好有幾個函數通過argv[]數組訪問程序的不同參數。現在,這些函數嵌套在main()函數中,因爲編譯器提供了允許這種結構的語言擴展。如何從main()函數外部訪問argv []?

我想擺脫嵌套功能,以便互操作性是可能的而不依賴於語言擴展。

首先我想到了一個程序啓動時我會指向argv[]的數組指針,這個變量將在main()函數之外,並在函數之前聲明,以便它們可以被它們使用。

所以我聲明這樣的指針,如下所示:

char *(*name)[]; 

應的指針,指針數組爲字符。然而,當我試圖把它指向argv[]我得到工作分配中的警告不兼容的指針類型:

name = &argv; 

可能是什麼問題呢?你有沒有想過使用main()功能以外的其他方式訪問argv[]陣列?

回答

6
char ** name; 
... 
name = argv; 

會做的伎倆:)

你看到char *(*name) []是一個指向指針的char數組。而您的函數參數argv具有指向char的指針的類型指針,因此& argv具有指向指向char的指針的指針的類型指針。爲什麼?因爲當你聲明一個函數接受一個數組時,編譯器就像一個帶指針的函數一樣。即,

void f(char* a[]); 
void f(char** a); 
void f(char* a[4]); 

是完全相同的等價聲明。這並不是說一個數組的指針,但作爲一個函數的參數是

HTH

+0

+1作爲第一個答案*和*唯一的答案迄今爲止解釋錯誤。 – 2010-10-30 09:11:43

+0

謝謝你的解釋!我使用'argv'作爲'char * argv []',所以我在開始時想到了一個數組指針。 – Sergi 2010-10-30 09:18:10

+0

@Johannes,@Sergi:謝謝,我希望C/C++書籍對數組和指針的差異提出更大的口音。這些經常混淆起來...... – 2010-10-30 09:18:33

3

這應該工作,

char **global_argv; 


int f(){ 
printf("%s\n", global_argv[0]); 
} 

int main(int argc, char *argv[]){ 
    global_argv = argv; 
f(); 
} 
0
#include <stdio.h> 

int foo(int pArgc, char **pArgv); 

int foo(int pArgc, char **pArgv) { 
    int argIdx; 

    /* do stuff with pArgv[] elements, e.g. */  
    for (argIdx = 0; argIdx < pArgc; argIdx++) 
     fprintf(stderr, "%s\n", pArgv[argIdx]); 

    return 0; 
} 

int main(int argc, char **argv) { 
    foo(argc, argv); 
} 
相關問題