将C字符串转换为无符号char指针

Casting C string to unsigned char pointer

本文关键字:无符号 char 指针 转换 字符串      更新时间:2023-10-16

我正在编译使用许多字节的低级代码。在某些情况下,使用双引号括起旧的C字符串对我来说是很方便的。

但是当用gcc或g++编译时(不知道其他编译器的行为),它一直困扰着我指向字符串的符号。

基本上当我写这个

const unsigned char & refok = *"ABCDEFGHI";

EDIT:好的,上面的代码并没有真正工作,因为理论上它只会保留对字符串第一个字符副本的引用。由于优化,它实际上允许某些编译器访问所有字符串,但可能随时中断。

const unsigned char oktoo[10] =
    {'A','B','C','D','E','F','G','H','I',0};

编译器什么也没说

但是它肯定会拒绝这个

const unsigned char * bad = "ABCDEFGHI";

with message

error: invalid conversion from 
   ‘const char*’ to ‘const unsigned char*’
   [-fpermissive]

这甚至不是一个警告,这是一个错误

我想知道为什么这个应该比使用引用更有问题,或者将单个字符从有符号字符转换为无符号字符?还是我错过了什么?

我想你错过了很多的东西!

第一行可能和你想的完全不同。(它涉及到临时文件的转换和寿命的延长。)

第二行用大括号初始化式中对应的char初始化每个unsigned char。

在第三行,编译器是正确的:字符串文字的类型是const char *,并且通常不能将T*转换为U*

注意,标准明确要求charunsigned charsigned char不同的类型。这里的理由是char应该是平台的本机字节类型,而其他两个是显式的无符号和有符号整型。无符号/有符号类型用于代数操作,而裸类型用于与系统接口(例如命令行参数和文件I/O)。

允许在数值类型之间进行隐式转换;这就是前两家公司正在做的事情。不允许在不同类型的指针之间进行隐式转换(除了将派生类指针转换为基类指针)。

注意,第一个没有给出对数组第一个字符的引用。它创建该字符的临时副本,转换为unsigned char类型,并将引用绑定到该副本,将临时副本的生命周期延长到引用的生命周期。

第二个函数将初始化器列表中的每个char转换为unsigned char数组元素。

第三个尝试将const char *转换为const unsigned char *;由于charunsigned char是不同的类型,因此不允许隐式指针转换。