学习字符串和指针,但结果令人困惑

时间:2016-04-29 10:51:25

标签: arrays string void-pointers

我试图了解指针,这段代码似乎返回错误的值。

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不打印?

感谢华莱士

3 个答案:

答案 0 :(得分:0)

你没有复制字符串,p_start和start是完全相同的字符串。修改一个,然后修改另一个。如果要复制字符串,请尝试使用strcpy

编辑:哦,你想要三张印刷品。以及你将它设置为&#39; k&#39;以及第一次迭代时所设置的每个循环,但你想要的是在打印出正确的循环后设置它。

试试这个,

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

答案 1 :(得分:0)

p_start并开始指向相同的内存区域。

p_start = start;

执行时

start[2]='k';

用'k'替换'3'字符。

因此,当i等于2时,两次打印“k”是正确的。

答案 2 :(得分: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;
    }