2010-10-01 16 views
10

Ich bin neu in C und versuche immer noch, das Konzept der Zeiger zu verstehen. Ich weiß, wie man eine Swap-Funktion schreibt, die funktioniert ... Ich mache mir mehr Sorgen darüber, warum diese bestimmte Funktion nicht funktioniert.Einfache Tauschfunktion ... warum tauscht diese nicht?

void swap(int* a, int* b) 
{ 
int* temp = a; 
a = b; 
b = temp; 
} 

int main() 
{ 
int x = 5, y = 10; 
int *a = &x, *b = &y; 
swap(a, b); 
printf(“%d %d\n”), *a, *b); 
} 
+5

Die offensichtliche Frage wäre, was ist der Unterschied zwischen dieser Implementierung und Ihrer Implementierung, die funktioniert? (Ich weiß, was das Problem mit diesem Problem ist, ich versuche nur, dir dabei zu helfen.) [Natürlich sind alle eifrigen Biber in SO bereit, direkt zu der Antwort zu springen.] –

+1

Eine solide Crash-Lektion auf Wert übergeben. Danke bitte. –

Antwort

29

Sie vermissen * s in der Swap-Funktion. Versuchen:

void swap(int* a, int* b) 
{ 
int temp = *a; 
*a = *b; 
*b = temp; 
} 

auf diese Weise, anstatt nur die Zeiger tauschen, sind Sie die int s Swapping, dass die Zeiger - zeigen.

1

Die Zeiger werden nach Wert übergeben. Dies bedeutet eine & b sind immer noch a und b wenn die aus der Funktion kommen;

versuchen so etwas wie diese

void swap(int* a, int* b) 
{ 
int temp = *a; 
*a = *b; 
*b = temp; 
} 
1

Der richtige Weg, es zu tun:

void swap(int* a, int* b) 
{ 
    int temp = *a; // Temp is set to the value stored at a (5) 
    *a = *b;  // value stored at a is changed to the value stored at b (10) 
    *b = temp;  // value stored in address b is changed to 5. 
} 
2

C ist eine Pass-by-Wert Sprache. Ihre swap Routine dererenziert nicht die Zeiger, die an sie übergeben werden, also ist von main aus der Perspektive nichts passiert.

1

Es ist tauschen. Es tauscht lokale Zeiger a und b innerhalb swap Funktion. Es tauscht sie perfekt aus, so wie es sollte.

Wenn Sie die Werte, auf die diese Zeiger zeigen, vertauschen möchten, sollten Sie Ihre swap-Funktion entsprechend neu implementieren, also die spitzen Werte und nicht die Zeiger tauschen.

10

Ihre swap() Funktion tut Arbeit, nach einer Mode - es die Werte der Variablen Swaps a und b, die swap() lokal sind. Leider unterscheiden sich diese von den a und b in main() - so sehen Sie eigentlich keinen Effekt durch Austauschen von ihnen.

+0

Es sollte die akzeptierte Antwort sein. –

0

Die Antwort von zildjohn1 ist der einfachste und klarste Weg, dies zu tun. Wenn Sie jedoch darauf bestehen, die Zeiger zu vertauschen, müssen Sie den Zeiger an den Zeiger übergeben, da der Zeiger selbst als Wert übergeben wird.

4

Wenn Sie über Zeiger nachdenken, müssen Sie sich über einige Abstraktionen im Klaren sein.

Ein Objekt im Speicher. Dies kann von jedem Typ (und Größe) sein. Ein Integer-Objekt belegt beispielsweise 4 Bytes im Speicher (auf 32-Bit-Maschinen). Ein Pointer-Objekt belegt 4 Bytes im Speicher (auf 32-Bit-Maschinen). Wie offensichtlich sein sollte, enthält das Integer-Objekt ganzzahlige Werte; Ein Zeigerobjekt enthält Adressen anderer Objekte.

Die C-Programmiersprache lässt Symbole (Variablen) diese Objekte im Speicher darstellen. Wenn Sie angeben,

int i;

Das Symbol (Variable) i steht für ein ganzzahliges Objekt im Speicher. Genauer gesagt repräsentiert es den Wert dieses Objekts. Sie können diesen Wert ändern, indem Sie i im Programm verwenden.

& Ich gebe Ihnen die Adresse dieses Objekts im Speicher.

Ein Zeigerobjekt kann die Adresse eines anderen Objekts enthalten. Sie deklarieren ein Zeigerobjekt mit der Syntax

int * ptr;

Genau wie andere Variablen repräsentiert die Zeigervariable den Wert eines Objekts, eines Zeigerobjekts. Dieser Wert ist zufällig eine Adresse eines anderen Objekts. Sie setzen den Wert eines Zeigerobjekts wie folgt:

ptr = & i;

Nun, wenn Sie im Programm ptr sagen, beziehen Sie sich auf seinen Wert, der die Adresse von i ist. Aber wenn Sie * ptr sagen, beziehen Sie sich nicht auf den Wert von ptr, sondern auf den Wert des Objekts, dessen Adresse in ptr, d. H.

Das Problem mit Ihrer Swap-Funktion ist, dass Sie Werte von Zeigern austauschen, nicht die Werte von Objekten, für die diese Zeiger Adressen halten. Um zu den Werten von Objekten zu gelangen, müssten Sie * ptr verwenden.

0

Umm vielleicht mit dieser

void swap(int** a, int** b) 
{ 
int** temp = a; 
a = b; 
b = temp; 
} 

int main() 
{ 
int x = 5, y = 10; 
int *a = &x, *b = &y; 
swap(&a, &b); 
printf(“%d %d\n”), *a, *b); 
} 
0

Ohne eine dritte Variable (Temp)

void swap(int* a,int* b) 
{ 
// a = 10, b = 5; 
    *a = *a + *b; // a now becomes 15 
    *b = *a - *b; // b becomes 10 
    *a = *a - *b; // a becomes 5 
} 
-1

Sie müssen so die Adresse a und b für Swap-Funktion zu senden, während Swap-Funktion aufrufen müssen Sie rufen ass swap (& a, & b) Damit Sie die Adresse übergeben, und ändern Sie die Adresse

-1
#define SWAP(a,b) ((a)=(b)+(a),(b)=(a)-(b),(a)=(a)-(b)) 

Funktioniert gut.

Verwandte Themen