C++中字符型变量的地址输出

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sszgg2006/article/details/7982866

在C++中,如果cout一个字符数组的话,那么它会沿着这个地址,一直输出这个字符串,直到遇到'\0',例如:

 char*c="cadn\0hello";

 cout<<c<<endl;

输出的结果是:cadn

如果我们自作聪明的想输出第一个字符的地址,例如这样输出:

 cout<<&c[0]<<endl;

不幸的是,这样输出的结果依旧不是我们需要的地址。

但是,如果我们回归到C语言的话,例如用printf的话,如下:

 printf("%x\n",&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类型变量和字符串变量的地址了。

阅读更多

没有更多推荐了,返回首页