今天,我遇到了这样的一种情况,我想输出一个字符串的首地址。
那么该怎么输出呢?通常我们可能的想法是直接cout啊。
比如:
char ss[20]="hello";
cout<<ss<<endl;
运行结果:
hello
我们会发现,ss存储的值虽然是一个地址,但我们执行cout的时,实际上它会输出ss指向的字符串。
那该怎么办?我在输出的时候其实考虑到上面的情况了,然后我想了想,如果我这样输出是不是就可以了:
char ss[20]="hello";
cout<<&ss[0]<<endl;
但实际运行结果还是:
hello
通过上面的例子我们会发现,只要我们cout后面的输出对象是一个char*的类型时,它都会当作要输出这个地址指向的字符串来执行。它会从这个地址开始输出字符,直到遇到’\0’停止。那我们怎样才能让cout输出char*类型存值的地址呢?
c是靠%s,%x,%p来区分指针表达式&ss[0]的输出形式的;c++没有这个格式控制,只能按一种形式输出。
c++标准库中I/O类对输出操作符<<重载,在遇到字符型指针时会将其当做字符串名来处理,输出指针所指的字符串。
既然是这样,我们只需要将char*类型的指针进行强制转换成别的类型的指针,cout就会输出指针存储的地址。我们可以把它强转成void*类型。
char ss[20];
cout<<(void*)ss<<endl;
运行结果:
0x7fff695cf900