c++ - 你能解释一下这个类型转换是做什么的吗?
问题描述
给定一个字符串const char*
const char *str = "Hello, World!\n";
std::cout << *str;
会给出H
,但std::cout << *(char (*)[12])str;
会给出完整的字符串Hello, World!
。
我可以理解这个演员需要 12 种数据,但是(*)
这里是什么意思?
解决方案
但是这里的 (*) 是什么意思?
char [12]
和之间的区别在于char (*)[12]
前者是 12 个字符的数组,而后者是指向 12 个字符的数组的指针。
请注意,当您将数组(例如字符串文字)转换为指针类型时,它将首先衰减为指向数组第一个元素的指针。指向数组第一个元素的指针不能与指向数组本身的指针相互转换。因此,通过重新解释的指针间接导致未定义的行为。
PS 避免使用 C 风格的转换运算符,而是更喜欢使用 static_cast、reinterpret_cast 和 const_cast。避免将字符串文字转换为非常量,因为这很容易导致意外修改字符串文字,从而导致未定义的行为。
PPS 要打印整个字符串,请使用std::cout << str;
. 这里不需要演员表。
那么char * [12]呢?
这是一个由 12 个指向 char 的指针组成的数组。
推荐阅读
- javascript - 在嵌套属性中使用 lodash 运算符
- javascript - 如何用现有的常量值替换变量
- php - Laravel/Apple : cors 起源严格
- php - Ubuntu 18.04 上的 php7.3 使用 ppa:ondrej/php 想要在升级时安装 apache2
- php - 为使用“Twofish”加密的 PHP 服务器寻找 mcrypt 的替代品
- python - 有时 wget 库给出错误:没有这样的文件或目录
- python - 如果不使用标准缩放器,内存错误
- woocommerce - Woocommerce 小计
- php - 如何在php中的两个日期之间进行迭代?
- ios - 当我尝试插入项目时,UICollectionView 在滚动时出现故障