2009-06-03 25 views
2

C99文字へのポインタへのポインタを関数に渡す

私はポインタへのポインタを使用して、名前を表示する関数に渡しています。

しかし、私はデバッガを通過します。パラメータのポインタへのポインタは何も指しません。しかし、私はそれをメインのすべての名前を表示するために使用しています。

整数を渡していた場合でも、整数値はそのまま残ります。なぜポインターへのポインターですか?

これはスコープと関係がありますか、mallocまたはcallocを使用してポインタへのポインタを割り当てる必要がありますか?何もprint_namesポイントまで

任意の提案のための多くのおかげで、あなたのwhileループ、あなたループでは

#include <stdio.h> 

void display_names(char **first_names); 

int main(void) 
{ 
    char *names[] = {"peter", "Mary", "John", 0}; 
    char **print_names = names; 

    while(*print_names) 
    { 
     printf("Name: %s\n", *print_names); 
     *print_names++; 
    } 

    display_names(print_names); 

    getchar(); 

    return 0; 
} 

void display_names(char **first_names) 
{ 
    while(*first_names) 
    { 
     printf("First name: %s\n", *first_names); 
     first_names++; 
    } 
} 
+2

私はちょうど私がやったように思えます。 whileループでポインタをインクリメントしました。だから今ポインタはnullへのポインタです。 – ant2009

答えて

6

は、その後、あなたはdisplay_namesに渡します。この時点で、 * print_names == 0の代わりにそのwhileループは、試してみてください。

char **print_names = names; 
while(*print_names) 
{ 
     printf("Name: %s\n", *print_names); 
     *print_names++; 
} 
print_names = names; 
display_names(print_names); 

これを2回名前をプリントアウトする必要があります - 一度whileループから、一度の関数呼び出しから。

+0

ポインタに別の一時ポインタを宣言するのではなく。これは、関数呼び出しの前に名前を再度割り当てる方が良いでしょうか。 \t print_names = names; \t display_names(print_names); – ant2009

+0

ええ、それもうまく動作します。私はこれを反映するために私の答えを変更しました。 –

+0

関数呼び出しは、単に次のようにすることができます:display_names(names); –

0
char *names[] = {"peter", "Mary", "John", 0}; 
char **print_names; 

int main(void) 
{   
    print_names = &names[0]; // point to peter 
    while(*print_names) 
     printf("Name: %s\n", *(print_names++)); // last address in here is John 

    print_names = &names[0]; // reset point to peter before call display_names 
    display_names(print_names+0); // peter 
    display_names(print_names+1); // Mary 
    display_names(print_names+2); // John 

    getchar(); 
    return 0; 
} 

void display_names(char **names_selected) 
{ 
    printf("Name: %s\n", *names_selected);  
} 
関連する問題