#include <iostream.h> class character { private: char * p; public : character(char * p) { this->p = p; } void display() { cout<<"输出的字符串为:"<<p<<endl; } }; int main(void) { char * p = "Hello"; character ch(p); ch.display(); return 0; } cout<<"输出的字符串为:"<<p<<endl; 请问这个地方输出字符串的时候为什么不是 * p了? 指针变量p不是存放的是字符串Hello的首地址吗? * p 应该才是字符串的内容啊。 我认为应该写成 cout<<"输出的字符串为:"<< *p <<endl; 但这样会报错。
解答:
你改成*p不会报错,输出的会是Hello的第一个字母H,因为p是字符串的首地址,加*就是第一个字符的内容,即H 你对字符串指针的了解不够,在输出时,p代表整个字符串,即 cout << p时会输出字符串的内容,即Hello,cout << p +1时会输出ello cout << &p时会输出字符串首地址 这是改成*p时的运行结果,Microsoft Visual C++ 6.0编译通过 输出的字符串为:H Press any key to continue追问:既然p是字符串的首地址,那输出cout<<p时应该输出的是地址啊。为什么会输出整个字符串?追答:字符串数组和整型数组是不太一样的,输出时p代表的是整个字符串,你要输出地址只能用&p,我现在也不是很确认&p是不是就是p的首地址,因为我用c语言printf("%p",p)输出的内容和cout << &p输出的内容差了那么一点 代码: #include <iostream> using namespace std; #include <stdio.h> void main() { char *sp,s[10] = "hello"; sp = s; cout << sp << endl; printf("%s\n",sp); printf("%p\n",sp); cout << &sp << endl; } 输出结果: hello hello 0012FF70 0012FF7C Press any key to continue 不是一个地址 下面是谭浩强老师书中的解释 给出字符指针变量,则系统先输出它所指向的一个字符数据,然后自动加1,使之指向下一个字符,然后再输出一个字符,如些直到遇到字符串结束标志‘\0’为止。 通过字符数组名或字符指针变量可以输出一个字符串。而对一个数值型数组,是不能企图通过数组名输出它的全部元素的。