分享

static_cast<void*> 及 C++字符指针解惑

 幸福的落叶@ing 2010-10-06

static_cast<void*> 及 C++字符指针解惑

例:

#include <iostream>
using namespace std;


#define P(type) \
 cout << "The adress of " #type " is " << type <<endl;
 
int main() {
 int* i = new int;
 long* l = new long;
 char* c = new char[100]; 

 c = "123456";
 float* f = new float[100];

 P(i);
 P(l);
 P(static_cast<void*>(c));            //这里括号中若只写c则得不到地址,而是值
 P(f);           //f、l、i就不必换了,但是换了也一样是地址
 cout << c <<endl;
  
 delete i;
 delete l;
 delete []c;
 delete []f;
}

 

说明两点:

(1):对于c = "123456";这句, 感觉c的值应该是地址才对, 为什么可以赋值?而且下面cout输出c的也是值, 并不是地址.

如果这样写c = "123456",对于编译器来说, 它会首先创建一个字符串常量, 存放在内存中, 其内容是"123456",然后把它的首地址赋给c, 这个过程是编译器自动完成的.也就是说, 编译器自动完成了以下动作:

1. 创建字串常量放于内存当中, 并记下这个地址

2. 将这个首地址赋给c

对于早期有的编译器不能优化字串常量, 那么象如下写:

char * p = "123456";

char *q = "123456";

虽然从字面上看, 两个字串常量的值是一样的, 但是他们的地址却不同, 所以此时p和q中的地址值也不相同, 但对现在的编译器, 它基本能够优化较简单的字串常量, 它会检查两个字串中的字符数和字符内容是否是一模一样, 如果相同, 它会把它们初始化为同一地址。

 

(2):为什么要进行static_cast<void*>(c)转换才能得到地址?

这是一个重载的问题:

cout 对 char*和const char*类型的operator << 重载都是输出char*指针指向的字符串的内容,而不是这个指针的值
Bruce Eckel写的《Thinking in c++ vol1》有一道练习题,也是关于这个问题,给出答案的Chuck Allison解释为:

The static_cast above is necessary because the output stream insertion operator is overloaded to treat a char* as a null-terminated string. All other pointers have their addresses printed out in hexadecimal.

(这里的all other pointers 是指float,int等不用转换的指针)


所以输入地址的标准做法是把char*变量cast成void* :
static_cast<void*>(c)

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多