【问题标题】:Learning strings and pointers but confusing results学习字符串和指针但结果令人困惑
【发布时间】:2016-08-24 12:02:25
【问题描述】:

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

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';然后我得到 ​​p>

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

谢谢华莱士

【问题讨论】:

    标签: arrays string void-pointers


    【解决方案1】:

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

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

    试试这个,

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

    【讨论】:

      【解决方案2】:

      p_start 和 start 指向同一个内存区域。

      p_start = start;
      

      当你执行时

      start[2]='k';
      

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

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 2020-06-14
          • 1970-01-01
          • 1970-01-01
          • 2016-03-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-07-30
          • 1970-01-01
          相关资源
          最近更新 更多