2009-06-03 4 views
2

C99Übergabe eines Zeigers an den Zeiger auf ein Zeichen in eine Funktion

Ich verwende einen Zeiger auf den Zeiger und übergibt ihn in eine Funktion, um die Namen anzuzeigen.

Allerdings, wenn ich durch den Debugger gehe. Der Zeiger auf den Zeiger im Parameter zeigt auf nichts. Allerdings verwende ich es, um alle Namen in main anzuzeigen.

Wenn ich eine Ganzzahl übergeben würde, wäre der ganzzahlige Wert immer noch da. Warum nicht ein Zeiger auf Zeiger?

Hat dies etwas mit Scope zu tun oder muss ich Speicher mit malloc oder Calloc für den Zeiger auf den Zeiger zuweisen?

Vielen Dank für Ihre Anregungen,

#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

Ich habe gerade scheinen, was ich getan habe. Ich habe den Zeiger in der while-Schleife inkrementiert. Also ist der Zeiger jetzt Zeiger auf Null. – ant2009

Antwort

6

In Ihrer while-Schleife Sie Schleife, bis print_names Punkte zu nichts, und dann übergeben Sie es an display_names. An diesem Punkt * print_names == 0. Statt dass while-Schleife, versuchen:

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

Dies sollte zweimal aus den Namen drucken - einmal von der while-Schleife und einmal von dem Funktionsaufruf.

+0

Anstatt einen anderen temporären Zeiger auf den Zeiger zu deklarieren. Könnte dies eine bessere Möglichkeit sein, die Namen vor dem Funktionsaufruf erneut zuzuordnen. \t print_names = Namen; \t display_names (Druck_Name); – ant2009

+0

Ja, das sollte auch funktionieren. Ich habe meine Antwort geändert, um das zu reflektieren. –

+0

Der Funktionsaufruf könnte einfach lauten: display_names (Namen); –

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);  
} 
Verwandte Themen