2017-12-26 13 views
1

Ich fange gerade an, Zeiger zu lernen, und ich versuche herauszufinden, warum mein Code nicht funktioniert. Ich bekomme keinen Kompilierungsfehler, aber der Code tut nicht was ich will. Warum übergebe ich nicht die Adresse eines Arrays? Wenn ich versuche, so zu tun, erhalte ich einen compiilation Fehler :(Funktion, die ein Zeichenarray nicht mooded

#include <stdio.h> 

void switch_name(char* name) 

{ 
    name= "testv2"; 
} 

void main() 
{ 
char *name1 = "test_name"; 
printf("%s\n", name1); 
switch_name(name1); 
printf("%s\n", name1); 
} 
+0

lesen empfohlen: [Was nach Wert vs. vorbei Referenz die Differenz zwischen Gang ist?] (Https://stackoverflow.com/questions/373419/whats-the-difference-between-passing-by-reference-vs-passing-by-value) –

+0

"Warum funktioniert mein Code nicht '-> Code funktioniert." noch der Code tut nicht was ich möchte "-> Was wollte der Code tun? – chux

Antwort

1

Nun, da C ist Pass von Wert. Sie Änderungen an einer lokalen Variablen (name in Funktion swicth_name()). Zur Erhaltung Änderungen der Adresse des Pass char* und die Adresse des Stringliteral zum char* direkt zuweisen (von den char** dereferencing). Beispiel hierfür

#include <stdio.h> 

void switch_name(char** name) 
{ 
    *name= "testv2"; 
} 

int main(void) 
{ 
    char *name1 = "test_name"; 
    printf("%s\n", name1); 
    switch_name(&name1); 
    printf("%s\n", name1); 
    return 0; 
} 

Hier kann die Funktion swicth_name bekam die Adresse der char* funktionieren würde name1. Wenn Sie es jetzt mit der unären * in switch_name dereferenzieren, weisen Sie die Adresse des Zeichenfolgenliterals der Variablen name von main() zu. Das "schwingt" die Veränderung.

0

Funktionsparameter sind ihre lokalen Variablen.

Sie können die Funktion aufrufen und seine Definition vorstellen, dass die folgende Art und Weise

char *name1 = "test_name"; 
switch_name(name1); 

//... 

void switch_name(/* char* name */) 
{ 
    char *name = name1; 
    name= "testv2"; 
} 

Wie Sie die ursprüngliche Variable name1 sehen nicht in der Funktion geändert wurde. Die Variable name ist der Parameter, der in der Funktion geändert wurde.

Sie müssen die ursprüngliche Variable als Referenz übergeben, wenn Sie sie in der Funktion ändern möchten.

Zum Beispiel

#include <stdio.h> 

void switch_name(char ** name) 
{ 
    *name= "testv2"; 
} 

int main(void) 
{ 
    char *name1 = "test_name"; 

    printf("%s\n", name1); 

    switch_name(&name1); 

    printf("%s\n", name1); 
} 

Vergleichen Sie das obige Programm mit dem folgenden Programm

#include <stdio.h> 
#include <string.h> 

void switch_name(char* name) 
{ 
    strcpy(name, "testv2"); 
} 

int main(void) 
{ 
    char s[] = "test_name"; 
    char *name1 = s; 

    printf("%s\n", name1); 

    switch_name(name1); 

    printf("%s\n", name1); 

    return 0; 
} 

Im ersten Programm, das Sie gehen, um die ursprünglichen Zeiger selbst mit einer Funktion zuzuweisen.

Im zweiten Programm werden die Daten, auf die der Zeiger zeigt, mit der C-Standardfunktion strcpy neu zugewiesen.

Berücksichtigen Sie, dass die C-Norm nach der Funktion main ohne Parameter werden wie

int main(void) 
deklariert werden
Verwandte Themen