2016-04-29 5 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 не печатают?

Благодаря Wallace

ответ

0

вы не копирование строк, p_start и начать есть точно такая же строка в том же месте. измените одно, а вы измените другое. если вы хотите скопировать строку, попробуйте использовать strcpy

EDIT: О, вы хотели, чтобы три были напечатаны. ну и каждый цикл вы устанавливаете на «k», поэтому на первой итерации его набор, но то, что вы хотите, это установить его после того, как он напечатал правильный.

попробовать это,

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

p_start и начальную точку в одной и той же области памяти.

p_start = start; 

При выполнении

start[2]='k'; 

вы замените '3' символ с 'к'.

Итак, правильно, что, когда i равно 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; 
    }