2010-10-30 41 views
9

Tôi tình cờ có một số chức năng truy cập các đối số khác nhau của chương trình thông qua mảng argv[]. Ngay bây giờ, những hàm này được lồng bên trong hàm main() vì phần mở rộng ngôn ngữ mà trình biên dịch cung cấp để cho phép các cấu trúc như vậy.Làm thế nào để truy cập argv [] từ bên ngoài hàm main()?

Tôi muốn loại bỏ các chức năng lồng nhau để có khả năng tương tác mà không phụ thuộc vào phần mở rộng ngôn ngữ. Trước hết, tôi nghĩ về một con trỏ mảng mà tôi sẽ trỏ đến argv[] khi chương trình bắt đầu, biến này sẽ nằm ngoài hàm main() và được khai báo trước các hàm để nó có thể được sử dụng bởi chúng.

Vì vậy, tôi tuyên bố một con trỏ như sau:

char *(*name)[]; 

Mà phải là một con trỏ đến một mảng của các con trỏ tới ký tự. Tuy nhiên, khi tôi cố gắng để trỏ nó đến argv[] tôi nhận được một cảnh báo về chuyển nhượng từ một loại con trỏ tương thích:

name = &argv; 

gì có thể là vấn đề? Bạn có nghĩ cách khác để truy cập mảng argv[] từ bên ngoài hàm main() không?

Trả lời

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

sẽ làm các trick :)

bạn thấy char *(*name) [] là một con trỏ đến mảng các con trỏ đến char. Trong khi đối số hàm của bạn argv có kiểu con trỏ trỏ tới char, và do đó & argv có kiểu con trỏ trỏ tới con trỏ tới char. Tại sao? Bởi vì khi bạn khai báo một hàm để lấy một mảng, nó giống nhau cho trình biên dịch như một hàm lấy một con trỏ. Tức là,

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

là các khai báo tương đương giống hệt nhau. Không phải là một mảng là một con trỏ, nhưng như một đối số chức năng nó là

HTH

+0

+1 cho là câu trả lời đầu tiên và * * câu trả lời duy cho đến nay giải thích sai lầm. –

+0

Cảm ơn bạn đã giải thích! Tôi đã sử dụng 'argv' như' char * argv [] 'nên tôi nghĩ về một con trỏ mảng trong phần đầu. – Sergi

+0

@Johannes, @Sergi: Cảm ơn, tôi muốn sách C/C++ đặt trọng âm lớn hơn về sự khác biệt của mảng và con trỏ. Những cách này thường bị trộn lẫn ... –

3

này nên làm việc,

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); 
} 
Các vấn đề liên quan