什么铸造char数组到多久?

时间:2014-03-21 23:55:30

标签: c++ casting

此代码的作者声明(long)tab返回选项卡的地址。这是真的吗?如果是的话,为什么会这样呢?

  char tab []= "PJC"    
  cout << " tab = " << tab << ", address: " << (long)tab << "\n" << endl;

3 个答案:

答案 0 :(得分:5)

是的,这是真的。考虑C / C ++中的原始数组,以便它们的名称是指向第一个元素的指针。所以,你可以写:

char tab[] = "PJC";
char c = *(tab + 1); // c ==  J

由于指针不超过表示内存中地址的整数值,因此将指针转换为long会打印出地址值。

您必须确保整数将包含所有值。指针始终与字大小匹配,因此在32位CPU上,指针为4字节,在64位中为8字节,您需要64位整数才能有溢出 - 具体类型取决于系统(可能是long long)。您可以使用intptr_t(感谢@Avt)来存储指针值。

答案 1 :(得分:1)

Typecasting变量会改变其解释,但实际值保持不变。如果您要使用格式说明符%x打印该值,那么您将始终获得相同的结果,您使用的类型组合无关紧要。

在这种情况下,tabchar*,它只是该位置的“地址”。

答案 2 :(得分:0)

您应该转到void*以获取地址。运行以下检查

char tab []= "PJC"    
cout << " tab = " << tab << ", address1: " << (void*)tab << ", address2: " << (long)tab << "\n" << endl;

但请记住,结果取决于架构!