2016-04-29 59 views
1

我想了解指針,並且此代碼似乎返回不正確的值。學習字符串和指針,但結果令人困惑

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 

如果我un-comment start [2] ='j';那麼我得到

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 

那麼爲什麼3不帶打印?

感謝華萊士

回答

0

你沒有複製字符串,P_START並開始處於完全相同的位置完全相同的字符串。修改一個,然後修改另一個。如果你想複製字符串,請嘗試使用strcpy

編輯:哦,你想要三個打印。每一個循環你都將它設置爲'k',所以在第一次迭代時它的集合,但是你想要的是在它打印出正確的集合之後設置它。

試試這個,

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

P_START和起點相同的內存區域。

p_start = start; 

當你執行

start[2]='k'; 

你更換 'K' 的 '3' 字。

所以當我等於2時打印'k'兩次是正確的。

0

當i = 0時,您將首先更改值。這意味着在打印之前3.甚至在打印之前2.嘗試給出如下的條件。指針實際上是指向變量的地址。你也可以通過第二個選項瞭解。我沒有測試,但希望能起作用。

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; 
    } 

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; 
    }