10

たまたま、argv[]配列を介してプログラムのさまざまな引数にアクセスする関数がいくつかあります。現在、これらの関数は、そのmain()ような構造を許可するためにコンパイラが提供する言語拡張により、関数内にネストされています。

ネストされた関数を取り除き、言語拡張に依存せずに相互運用できるようにしたいと考えています。

まずargv[]、プログラムの開始時に指す配列ポインターを考えました。この変数は関数の外にあり、main()関数の前に宣言して、関数で使用できるようにします。

そのため、次のようにそのようなポインターを宣言しました。

char *(*name)[];

これは、文字へのポインターの配列へのポインターである必要があります。ただし、それをポイントしようとするとargv[]、互換性のないポインター型からの割り当てに関する警告が表示されます。

name = &argv;

何が問題なのですか?関数argv[]の外から配列にアクセスする別の方法を考えていますか?main()

4

3 に答える 3

7
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

于 2010-10-30T09:00:43.383 に答える
4

これはうまくいくはずです、

char **global_argv;


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

int main(int argc, char *argv[]){
  global_argv = argv;
 f(); 
}
于 2010-10-30T09:01:02.320 に答える
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);
}
于 2010-10-30T09:11:10.953 に答える