【发布时间】:2013-05-03 04:00:12
【问题描述】:
我从教科书中得到了这段代码:
#include <iostream>
using namespace std;
int main(){
char str1[]="hello,world!", str2[20], *p1, *p2;
p1=str1; p2=str2;
/*
for(;*p1!='\0';p1++,p2++){
cout<<"p1="<<*p1<<endl;
*p2=*p1;cout<<"p2="<<*p2<<endl;
}
*p2='\0';
p1=str1; p2=str2;
*/
cout<<"p1="<<p1<<endl;
cout<< "p2="<<p2<<endl;
return 0;
}
我运行了这段代码,它会输出p1=hello,world!p2=
我能理解。
但是如果我取消注释for循环,输出显示在这里我很困惑,为什么在for循环之后,为什么它显示p1=而不是显示p1=hello,world!,以及指针p2,即使在分配之后for 循环,它仍然显示p2=?
但是在我取消注释p1=str1; p2=str2;这一行之后,输出是p1=hello,world!, p2=hello,world!,为什么会这样?
而写这行*p2='\0';的原因是什么,这行注释掉与否无所谓,之前的输出不会改变。
谁能告诉我这里的 char 指针是如何工作的?
【问题讨论】:
-
请下次确保您的代码已结束等。您让我们难以阅读代码而不是专注于手头的问题。
-
*p2 = '\0';非常重要。仅仅因为它工作一次并不意味着它会一直工作。未定义的行为可以做到这一点。 -
感谢您的回复。你能告诉我
*p2='\0'在这里具体做什么吗? -
@chris 我认为 *p2 = '\0'; 在技术上没有任何问题;该操作的结果已定义。
-
@Ozraptor,你颠覆了我的观点。如果没有该语句,
str2将保持未终止状态,然后输出。该输出会导致未定义的行为,因为它无法确切知道字符串何时结束。这就是空终止符的用途。