2016-04-29 5 views
1

Ich versuche, über Zeiger zu lernen, und dieser Code scheint falsche Werte zurückzugeben.Lernfäden und Zeiger, aber verwirrende Ergebnisse

char start[5]= "1234"; // Auto adds Null Char; 
char* p_start; 
int i; 

int main(){ 
    printf("Original %s\n",start); 
    p_start = start; 
    for (i=0; i<4; i++) 
    { 
    // start[2]='j'; 
     printf("Line 1 %c\n",start[i]); 
     start[2]='k'; 
     printf("Line 2 %c\n",p_start[i]); 
    } 
    return 0; 
} 

Original 1234 
Line 1 1 
Line 2 1 
Line 1 2 
Line 2 2 
Line 1 k ---------------- Why is this not 3 
Line 2 k 
Line 1 4 
Line 2 4 

Wenn ich Kommentar abstarte [2] = 'j'; dann bekomme ich

Original 1234 
Line 1 1 
Line 2 1 
Line 1 2 
Line 2 2 
Line 1 j Correct 
Line 2 k 
Line 1 4 
Line 2 4 

Also warum wird die 3 nicht gedruckt?

Dank Wallace

Antwort

0

Sie nicht die Saiten, p_start Kopieren und starten Sie sind genau die gleiche Zeichenfolge an der exakt gleichen Stelle. ändern Sie einen und Sie ändern den anderen. Wenn Sie die Zeichenkette kopieren möchten, versuchen Sie

EDIT: Oh, Sie wollten die drei gedruckt. Nun, bei jeder Schleife, die Sie auf "k" setzen, ist es bei der ersten Iteration so, aber Sie wollen sie einstellen, nachdem sie die richtige gedruckt hat.

dies versuchen,

if(i == 2) 
    start[2] = 'k'; 
0

p_start und auf den gleichen Speicherbereich starten.

p_start = start; 

Wenn Sie ausführen

start[2]='k'; 

Sie die '3' Charakter mit 'k' ersetzen.

Also ist es richtig, dass, wenn i gleich 2 ist, 'k' zweimal gedruckt wird.

0

Sie ändern den Wert zuerst, wenn i = 0 ist. Das bedeutet vor dem Drucken 3. noch vor dem Drucken 2. Versuchen Sie, eine Bedingung wie unten zu geben. Pointer zeigt die Adresse der Variablen an. Sie können auch durch die 2. Option verstehen. Ich habe das nicht getestet, hoffe aber, dass es funktionieren wird.

int main(){ 
     printf("Original %s\n",start); 
     p_start = start; 
     for (i=0; i<4; i++) 
     { 
     printf("Line 1 %c\n",start[i]); 
     if(i==2) 
      start[2]='k'; 
     printf("Line 2 %c\n",p_start[i]); 
     } 
     return 0; 
    } 

oder

int main(){ 
     printf("Original %s\n",start); 
     p_start = start; 
     printf("Pointer %s\n",p_start); 
     start[2]='k'; 
     printf("Original %s\n",start); 
     printf("Pointer %s\n",p_start); 
     return 0; 
    }