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

Learning strings and pointers but confusing results

我试图了解指针,但此代码似乎 return 不正确的值。

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

如果我取消注释 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 没有打印出来?

谢谢华莱士

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

编辑:哦,你想要打印三个。好吧,每个循环你都将它设置为 'k',所以在第一次迭代时设置它,但你想要的是在打印正确的之后设置它。

试试这个,

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

p_start和start指向同一个内存区

p_start = start;

当你执行

start[2]='k';

您将字符“3”替换为 'k'。

所以当 i 等于 2 时打印 'k' 两次是正确的。

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