学习字符串和指针但结果令人困惑
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;
}
我试图了解指针,但此代码似乎 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;
}