2016-04-29 77 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; 
    }