
关于cpp指针的小问题。
voidmain(){char*p;cin>>*p;cout<<*p<<endl;}请问编译器提示没有初始化p,并且该程序无法运行?好的,谢谢。现在可以运行了,但是当我输...
void main()
{
char *p;
cin>>*p;
cout<<*p<<endl;
}
请问编译器提示没有初始化p,并且该程序无法运行?
好的,谢谢。
现在可以运行了,但是当我输入abc时,它只能输出a,而不是abc,请问这是为什么呢? 展开
{
char *p;
cin>>*p;
cout<<*p<<endl;
}
请问编译器提示没有初始化p,并且该程序无法运行?
好的,谢谢。
现在可以运行了,但是当我输入abc时,它只能输出a,而不是abc,请问这是为什么呢? 展开
4个回答
展开全部
在函数内的char *p;声明了char*类型对象即指向char对象的指针p,但没有经过初始化,它的值是随机的(在某些IDE的Debug模式下编译时由于包含调试信息,可能是某个固定值),无法保证指向可以被安全访问的存储器空间。之后表达式cout<<*p中的子表达式*p被引用时,可能会访问系统不允许访问的空间,因此产生运行期错误(例如段错误或访问违例),很可能直接导致程序崩溃。
std::cout的类std::ostream操作符operator<<经过重载,对于不同的操作数类型有不同的行为。对于表达式*p,为*操作符对char*对象的操作结果,因此类型是char,cout<<*p会输出字符*p。而对于p这样的char*类型对象,<<的行为是把它作为字符串的首个字符的指针,顺序输出指针所指向的char对象(字符)并使指针自增,直至这个指针指向字符串结束符'\0'——即输出了字符串。因此这里可以用cout<<p输出p为起始字符指针的字符串。
同样,对于cin的operator>>,cin>>*p表示预期输入char字符读入表达式*p代表的char对象。输入超过一个字符时,按顺序取缓冲区第一个字符到*p中(这里是'a'),后面的没有被输入到*p。此时*p等于'a',因此按字符输出cout<<*p就输出了字符'a'。要输入字符串,应该用cin>>p,注意这里p要预先通过std::malloc或new操作符被分配一段可访问的空间,这样p是这段空间的首个char对象的指针,*p或p[0]表示第一个字符,*(p+1)或p[1]表示第二个字符……指针p本身即可表示这段空间起始的、元素为char的C风格字符串。
//例如:
char *p = new char[10];
cin>>p; //这里分配的空间够存放10个char字符,扣除自动添加的字符串结束符'\0',只能输入9个字符,否则仍然极有可能因为访问错误的空间而导致程序无法继续运行。
cout<< p <<endl;
delete[] p; //动态分配的空间不会自动被释放,所以需要手动释放,以免内存泄露(尽管操作系统会回收进程结束后泄露的空间,但最好养成释放不使用的空间的习惯;为了防止误用,之后可以用 p = NULL; 以免重复释放造成程序崩溃等不可预料的后果)。如果用p = (char*)std::malloc(sizeof(char)*10)等C标准库函数分配空间,对应用std::free(p)释放——这些库函数通常都在<cstdlib>中,如果没有using namespace std;等,需要加命名空间前缀std::以进行引用(<stdlib.h>这种包含了全局命名空间内的库函数的旧的头文件在一个标准C++实现中是不必要的,尽管通常IDE附带的C语言实现中会存在;至于<iostream.h>等旧的C++头文件应该被弃用,使用<iostream>,对应std::cin、std::cout、std::endl等)。
//或者使用数组,因为是函数内的非静态对象,进入函数自动分配空间,退出函数自动释放。
char p[10];
cin>> p ;
cout<< p <<endl;
====
[原创回答团]
std::cout的类std::ostream操作符operator<<经过重载,对于不同的操作数类型有不同的行为。对于表达式*p,为*操作符对char*对象的操作结果,因此类型是char,cout<<*p会输出字符*p。而对于p这样的char*类型对象,<<的行为是把它作为字符串的首个字符的指针,顺序输出指针所指向的char对象(字符)并使指针自增,直至这个指针指向字符串结束符'\0'——即输出了字符串。因此这里可以用cout<<p输出p为起始字符指针的字符串。
同样,对于cin的operator>>,cin>>*p表示预期输入char字符读入表达式*p代表的char对象。输入超过一个字符时,按顺序取缓冲区第一个字符到*p中(这里是'a'),后面的没有被输入到*p。此时*p等于'a',因此按字符输出cout<<*p就输出了字符'a'。要输入字符串,应该用cin>>p,注意这里p要预先通过std::malloc或new操作符被分配一段可访问的空间,这样p是这段空间的首个char对象的指针,*p或p[0]表示第一个字符,*(p+1)或p[1]表示第二个字符……指针p本身即可表示这段空间起始的、元素为char的C风格字符串。
//例如:
char *p = new char[10];
cin>>p; //这里分配的空间够存放10个char字符,扣除自动添加的字符串结束符'\0',只能输入9个字符,否则仍然极有可能因为访问错误的空间而导致程序无法继续运行。
cout<< p <<endl;
delete[] p; //动态分配的空间不会自动被释放,所以需要手动释放,以免内存泄露(尽管操作系统会回收进程结束后泄露的空间,但最好养成释放不使用的空间的习惯;为了防止误用,之后可以用 p = NULL; 以免重复释放造成程序崩溃等不可预料的后果)。如果用p = (char*)std::malloc(sizeof(char)*10)等C标准库函数分配空间,对应用std::free(p)释放——这些库函数通常都在<cstdlib>中,如果没有using namespace std;等,需要加命名空间前缀std::以进行引用(<stdlib.h>这种包含了全局命名空间内的库函数的旧的头文件在一个标准C++实现中是不必要的,尽管通常IDE附带的C语言实现中会存在;至于<iostream.h>等旧的C++头文件应该被弃用,使用<iostream>,对应std::cin、std::cout、std::endl等)。
//或者使用数组,因为是函数内的非静态对象,进入函数自动分配空间,退出函数自动释放。
char p[10];
cin>> p ;
cout<< p <<endl;
====
[原创回答团]
参考资料: 原创
展开全部
你定义的指针p没有分配内存
在里面加一句:p=(char*)malloc(20*sizeof(char));//分配10个字节大小的空间,头文件要包含stdlib.h才行,另外输出的时候之间输出p就可以了,不用加*,因为p就代表字符串的首地址
希望我的回答对你有帮助!
你把字符串"abc"的地址给了指针p,当然不用再给指针分配空间了啊
char *p="abc";这句的意思是把字符串"abc"的地址赋给p,注意p的值是地址
在里面加一句:p=(char*)malloc(20*sizeof(char));//分配10个字节大小的空间,头文件要包含stdlib.h才行,另外输出的时候之间输出p就可以了,不用加*,因为p就代表字符串的首地址
希望我的回答对你有帮助!
你把字符串"abc"的地址给了指针p,当然不用再给指针分配空间了啊
char *p="abc";这句的意思是把字符串"abc"的地址赋给p,注意p的值是地址
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
cin前面加一句p=new char;
你只读入一个*p啊 只有一个字符咯 以读到的第一个为准
你只读入一个*p啊 只有一个字符咯 以读到的第一个为准
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
我刚学不久 不过我分析应该是abc是字符串类型 你定义的是字符类型
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询