2016-04-29 7 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 

私は[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は印刷されないのですか?

おかげウォレスあなたは、文字列、p_startをコピーし、起動していない

答えて

0

はまったく同じ場所でまったく同じ文字列です。 1つを変更し、もう一方を変更します。文字列をコピーする場合は、strcpy

編集してください。まあ、すべてのループを 'k'に設定しているので、最初の反復では設定されていますが、あなたが望むのは、正しいものを印刷した後に設定することです。

p_start

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

、これを試してみて、同じメモリ領域へのポイントを開始します。

p_start = start; 

あなたが 'K' と '3' の文字を置き換える

start[2]='k'; 

実行します。

だから、私は2に等しいとき、「k」を2回印刷されていることが正しいのです。

0

あなたは、i = 0のとき、非常に最初の値を変更しています。つまり、印刷する前に3を印刷する前のことを意味します。2.以下のような条件を試してください。ポインタは実際に変数のアドレスを指しています。 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; 
    } 
関連する問題