我试图了解指针,这段代码似乎返回错误的值。
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不打印?
感谢华莱士
答案 0 :(得分:0)
你没有复制字符串,p_start和start是完全相同的字符串。修改一个,然后修改另一个。如果要复制字符串,请尝试使用 strcpy
试试这个,
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;
}