输出字符指针的值
在C++中,如果cout一个字符数组的话,那么它会沿着这个地址,一直输出这个字符串,直到遇到" ",例如:
char*c="cadn hello";
cout<<c<<endl;
输出的结果是:cadn
如果我们自作聪明的想输出第一个字符的地址,例如这样输出:
cout<<&c[0]<<endl;
不幸的是,这样输出的结果依旧不是我们需要的地址。
但是,如果我们回归到C语言的话,例如用printf的话,如下:
printf("%x ",&c[0]);
幸福的事情发生了,输出的结果是:
46f020
的确是字符串的首地址,但是,如果我们要输出字符串的地址,难道就这一种方法吗?难道我们就不可以用我们C++上的cout达到我们的效果吗?
原因:c是靠%s,%x,%p来区分指针表达式&a[0]的输出形式的;c++没有这个格式控制,只能按一种形式输出,对char*类型的指针值就理解为串输出,所以必须对这个指针表达式做类型转换处理。
例如:
char c="a";
cout<<” &c:”<<&c<<endl;
输出的仍然不是字符变量c的地址。
在C++中,字符串是以空终止符("/0")结尾的字符数组,通过字符串中第一个字符的指针访问字符串。也就是说,字符串的值是字符串中第一个字符的(常量)地址。如下的面3种形式表示:
char *str="string";
charstr2[]="string2";
charstr3[]={"s","t","r","i","n","g","3","/0"};
cout<<"line 1:str="<<str<<endl;
cout<<"line 2:str2="<<str2<<endl;
cout<<"line 3:str3="<<str3<<endl;
运行可知,这3行的输出就是保存的字符串的值,而并非我们认为的地址。那么,我们可以联系到前面&c,其实这就是一个char *的变量,所以,输出的自然就应该是字符串的值。可是,&c保存的字符串是没有终止符的,因此输出的也就是乱码了。
最近,在读到《C++程序设计教程》(第4版)第12章的时候,我才解决了这个疑惑。实际上,C++标准库中I/O类对输出操作符<<重载,在遇到字符型指针时会将其当做字符串名来处理,输出指针所指的字符串。既然这样,我们就别让他知道那是字符型指针,所以得进行类型转换,即:希望任何字符型的指针变量输出为地址的话,都要作一个转换,即强制char *转换成void *,如下所示:
cout<<"static_cast<void *>(&c)="<<static_cast<void*>(&c)<<endl;
cout<<"static_cast<void *>(str)="<<static_cast<void*>(str)<<endl;
此时,可以看到输出的结果就是char类型变量和字符串变量的地址了。
转自:http://blog.csdn.net/sszgg2006/article/details/7982866
-----------------------------------------------------------------------------------------------------------------------------------------------
C++中遇到字符型指针会将其当做字符串名来处理,但是对于string类指针,却可以直接输出指针的值,代码如下:
#include <iostream> #include <string> using namespace std; int main() { string str = "abc"; char *p = "abc"; cout << p << endl; //字符指针的值不能直接输出 string * ps = new string(str); cout << ps << endl; //字符串指针的值可以直接输出 cout << *ps << endl; str = * ps; //string类对=进行了重载,类似深拷贝,参数是string类对象,所以*ps就是一个string对象 delete ps; cout << str << endl; return 0; }
- 上一篇:没有了
- 下一篇: 堆区和栈区的区别