2017-03-24 18 views
0

タイトルが100%正しくない場合は、私を許してください。私は、文字列へのポインタと配列へのポインタへのポインタ(?)の2つの入力を受け取る関数を持っています。 (文字列配列がchar *inpある) 配列へのポインタへのポインタ

  • 私が書いている機能は、私はこれらの二つの引数を取ってやって欲しい int string_parser(char *inp, char **array_of_words[])

    で、関数は、文字列配列に

    1. に言葉の量を返す必要がありますポインターの配列へのポインターchar **array_of_words[] - 各単語の最初の文字のアドレスを指している配列の各要素(私はそれが単語であれば謝罪します)
      私はポインターの配列へのポインターを作成し、この配列
      char **startOfWords_ptr = (char **) malloc(amountOfWords * sizeof(char*));
      内容をうまく操作しています。ポインタはポインタの配列の先頭アドレスを指すように:私は言っているが、私は*array_of_words = *(startOfWords_ptr);でそれを

    を行う方法を理解していない - 私はすぐに戻ってarray_of_words*start_of_wordsで配列を渡したいですか?
    確かに私はいない印刷するとき、私は出力としてコメントを...

    printf("%p\n", (void *) *array_of_words); // 0x401f2c, o 
    printf("%p\n", (void *) *startOfWords_ptr); // 0x401f2c, o 
    
    printf("%p\n", (void *) array_of_words[1]); // 0x401f2c, o 
    printf("%p\n", (void *) startOfWords_ptr[1]); // 0x401f30, t 
    

    提案を同じ値を得ることはありませんので、

    *array_of_words = (startOfWords_ptr); // This currently does not work 
    
    printf("%p, %c\n", (void *) array_of_words[0], *array_of_words[0]); // 0xcbbdd0, ; 
    printf("%p, %c\n", (void *) startOfWords_ptr[0], *startOfWords_ptr[0]); // 0x401f3b, o 
    
    printf("%p, %c\n", (void *) array_of_words[1], *array_of_words[1]); // 0x401f2c, o 
    printf("%p, %c\n", (void *) startOfWords_ptr[1], *startOfWords_ptr[1]); // 0x401f3f, t 
    
  • +1

    C++では、通常、 'std :: string'と' std :: vector'を使用し、生の配列とメモリの割り当てを避けます。そうではありません。言語の*自然*構造を使用するときと同じではありません。 – crashmstr

    +0

    C++タグが削除されました – fOrceez

    +0

    インデックスは0から始まりますが、それだけではありません。 –

    答えて

    1

    さて、それでは、この関数の呼び出し元の観点からこれを見てみましょう:

    int main(void) 
    { 
        char my_input[] = "This is a test"; 
        char **my_output = NULL; 
    
        int count = string_parser(my_input, &my_output); 
        for (int i = 0; i < count; i++) 
        printf("pointer #%d: %p\n", i, (void *) my_output[i]); 
    } 
    

    我々はstring_parserを呼び出した後、my_outputcharへのポインタの配列の最初を指しますことを知っています。 my_outputの値を変更する必要があるので、呼び出しのポインタ(&my_output)を渡す必要があります。

    これはそうchar ***array_of_wordschar **array_of_words[]と同じである、string_parserのプロトタイプの両方T *aとして扱われ

    int string_parser(const char *inp, char ***array_of_words) 
    { 
        ... 
    } 
    
    関数パラメータ宣言の文脈において

    T a[N]T a[]する必要があることを意味する - の両方が最終的ですchar ***

    だから私はポインタの配列へのポインタを作成し、この配列 char **startOfWords_ptr = (char **) malloc(amountOfWords * sizeof(char*)); とうまく内容を操作されているにスペースが割り当てられている

    与えられました。私はすぐに戻ってarray_of_words*start_of_wordsで配列を渡したい - しかし、私はそれを

    を行う方法を理解していない、あなたは後方にそれを持っている - あなたは*array_of_wordsstartOfWords_ptrを割り当てたい:

    *array_of_words = startOfWords_ptr; // char ** = char ** 
    

    array_of_wordsは間接参照のレベルがstartOfWords_ptrよりも1つ多いので、タイプを一致させるために逆参照する必要があります。この割り当ての後、

    *array_of_words[i] == startOfWords_ptr[i] // char * == char * 
    
    +0

    ありがとう、私は私が必要なものの理解を得るのを助けた。正しい割り当てがあっても、間違って印刷されていました。私が必要としなかったときの逆参照、私が必要なときに逆参照しなかった。回答は受け入れられました:) – fOrceez

    1

    関数のシグネチャでこのパラメータ:

    char **array_of_words[] 
    

    は、次のように書き換えられます。

    char ***array_of_words 
    

    I.E.

    char **array_of_words 
    

    かのように:としてそれを書くのいずれか

    char *array_of_words[] 
    

    これはmain() 2番目のパラメータを記述することができ、さまざまな方法と非常によく似ています。

    関連する問題