打印char *与`&`和`(int *)`有什么区别?

时间:2016-11-04 14:23:28

标签: c++ arrays pointers

我正在学习OOP课程,但我是C ++的新手。我的导师向我们介绍了C ++中的字符数组。他说,要在C ++中获取字符数组的基址,可以使用以下任一方法:

char* a = "Test String";
cout << &a; // Prints base address of char array

char* a = "Test String";
cout << (int*)a;

但是当我尝试两个相同的char数组时,我得到了不同的结果。两者有什么区别?

2 个答案:

答案 0 :(得分:12)

更改讲师。这是无稽之谈。第一个片段采用指针的地址(字符数组)。第二个片段将char指针转换为指向int的指针,并打印转换后的指针。

执行此操作的可能原因是,如果您尝试打印指向char的指针,编译器将选择operator <<的特殊重载并打印字符串而不是指针。但是,我宁愿将其转换为void*而不是int*。原因是转换为void*可以使用更安全的static_cast

答案 1 :(得分:4)

如果你没有犯错误,你的导师就给你提供了不好的例子。实际代码应为:

char a[] = "Test String";
cout << &a; // Prints base address of char array

vs

char a[] = "Test String";
cout << static_cast<void *>( a ); // Prints base address of first element of char array

注意,在C ++中不推荐将字符串文字分配给char *,它应该是const char *