C ++中指针强制转换的含义是什么?
例如,写什么做什么?
为什么将uint32_t指针转换为(const char *)??
class A{
uint32_t a;// initialized by some value
void write(ostream& os){
os.write((const char*)&a, sizeof(a));
}
};
答案 0 :(得分:2)
如果您查看documentation of ostream::write
:
basic_ostream& write( const char_type* s, std::streamsize count );
表现为UnformattedOutputFunction。 [...]
因此write
对流执行无格式写入。这意味着没有文本格式,转换等(例如新行)。为此,它需要一个字节缓冲区插入到流中。不幸的是,C ++没有byte
类型作为一等公民。而是使用char
。这就是为什么演员要const char*
。
答案 1 :(得分:2)
指针是存储内存位置的变量。因此所有指针都具有相同的值范围(从0到最大支持内存位置的整数)。
现在,指针支持一个名为dereferencing的操作:访问存储在该内存地址的对象。如果你有一个内存地址,并且你想访问那里的对象,你需要知道对象的大小(以字节为单位)以及很多关于如何实际解释那里的值的东西。所有这些都是类型所知。所以,我们有不同类型的指针,我们可以在它们之间进行转换,因为它们都具有相同的值域。
这意味着通过更改指针的类型,您可以对同一对象进行不同的解释。
让我们回答您的问题。您显示的写入函数应该逐字节写入流(这有很多原因,例如字节是存储的最小单位,因此您可以通过写入其字节来编写任何内容)。现在,您有一个4字节的int,您希望逐字节访问它。你是怎么做到的?只需获取指向它的指针,将其转换为字节大小的类型(char)并使用指针算法访问4个字节(基本上访问4个连续的内存位置) - 这就是为什么你还需要发送类型的大小。作为预防措施,第一个参数的请求类型为const char*
,以保证它不会更改数据。
现在,在你的情况下,强制转换(指针转换)是明确的。
答案 2 :(得分:0)
这是一些数据结构的序列化。
C ++中指针转换的含义是什么?
ofstream::write
期望const char* s
作为其第一个参数
为什么将uint32_t指针转换为(const char *)??
它将四个字节写入某个流(无符号整数),也许写入std :: ofstream。这样,它将存储在a
中的值写入例如文件。
答案 3 :(得分:0)
成员函数write
按以下方式声明
basic_ostream<charT,traits>& write(const char_type* s, streamsize n);
如您所见,其第一个参数的类型为const char_type *
在此次电话会议中
os.write((const char*)&a, sizeof(a)
使用了uint32_t *
类型的指针。但是,在C ++中没有从uint32_t *
类型到类型const char_type *
的隐式转换。因此,使用了显式转换,即尝试将类型为uint32_t
的对象写为字节序列。