2016-06-24 20 views
2

Ich bin ein Anfänger von C-Programmierung. Der Code des Austausch v [i] und v [j] aus dem Buch ist:Austausch mit Zeiger-Array

void swap2(char *v[], int i, int j) { 
    char *temp; 

    temp = v[i]; 
    v[i] = v[j]; 
    v[j] = temp; 
} 

Ich bin nicht sicher, ob ich diese richtig bekam. Ich denke, v ist hier ein Array, das Zeiger speichert, so v[i] und v[j] sind Zeiger. Hier Temp ist auch ein Char-Zeiger, aber es macht mich das Gefühl, dass temp = v[i]; diese Aussage sagt ein Zeiger v[i] ist eine Adresse zugewiesen, und ich denke, wenn wir char *temp in char temp ändern wird die Funktion korrekt machen. Könnte mir jemand dabei helfen?

+1

Wenn Sie gemacht 'temp' einen' statt 'char *' char' Sie eine 'char *' zu einem 'char' zuweisen würde, und Sie würden wahrscheinlich einen Kompilierungsfehler erhalten .. –

+0

Ein Zeiger ** ist ** eine Adresse. – Barmar

Antwort

3

Die Funktion ist korrekt wie sie ist.

v ist als ein Array von char * deklariert. So ist jeder v[i] ein char *. Daher verwenden Sie beim Durchführen des Swaps char *.

+0

Danke für Ihre Antwort. Aber warum können wir "temp = v [i]" anstelle von "* temp = v [i]" schreiben. Ich denke, selbst wenn temp als Zeiger bekannt ist, sollte das * immer noch angezeigt werden. –

+1

Nein, weil '* temp' vom Typ' char' ist, also würde es sich um einen Typkonflikt handeln. – dbush

+0

würde '* temp = * v [i]' auch funktionieren? –

1

diese Aussage sagt ein Zeiger v[i] zu einer Adresse zugeordnet ist

Sie scheinen eine Reihe von Zeichen mit einer Reihe von Zeichenzeiger werden verwirrend: v[i] ist einfach das i-te Element eines Array bestehend auschar *.

In C ist alles von Wert übergeben, so sind die Zeiger. Sie haben recht, wenn Sie davon ausgehen, dass v[] ein Array ist, das char Zeiger speichert.

Der Code gültig ist, weil die Zeiger vertauscht worden sind, nicht die char Variablen zeigte auf: v[i] und v[j] Zeiger sind, sollten daher temp auch ein Zeiger sein.

Der folgende Testcode zeigt es von Anrufer Sicht: Sie können leicht beobachten, was in Ihrer Funktion passiert. Zeiger werden als Werte übergeben, die ausgetauscht werden, aber die char Variablen, auf die sie zeigen, bleiben unverändert (b und c in diesem Beispiel).

#include <stdio.h> 

void swap2(char *v[], int i, int j) { 
    char *temp; 

    temp = v[i]; 
    v[i] = v[j]; 
    v[j] = temp; 
} 

int main (void) 
{ 
    char a = '1', b = '2', c = '3', d = '4', e = '5'; 
    char *v[5] = {&a, &b, &c, &d, &e}; 

    for(int i = 0; i < 5; i++) 
     printf("%p:%c ", (void*)(v[i]), *(v[i])); 
    printf ("\n"); 

    swap2(v, 1, 2); 

    for(int i = 0; i < 5; i++) 
     printf("%p:%c ", (void*)(v[i]), *(v[i])); 
    printf ("\n"); 
    printf("b = %c\n", b); 
    printf("c = %c\n", c); 
return 0; 
} 
Verwandte Themen