![](/img/trans.png)
[英]Invalid conversion from ‘const char*’ to ‘unsigned char*’
[英]Invalid conversion from unsigned char* to char*
这是一个代码 -
1 int main(int argc, char *argv[])
2 {
3 signed char S, *psc;
4 unsigned char U, *pusc;
5 char C, *pc;
6
7 C = S;
8 C = U;
9
10 pc = psc;
11 pc = pusc;
12
13 return 0;
14 }
$ gcc test.cpp -o a
test.cpp: In function ‘int main(int, char**)’:
test.cpp:10:7: error: invalid conversion from ‘signed char*’ to ‘char*’ [-fpermissive]
test.cpp:11:7: error: invalid conversion from ‘unsigned char*’ to ‘char*’ [-fpermissive]
这是在英特尔32位机器上的Ubuntu 12.10上的gcc版本4.6.3上编译的。
考虑到char
类型是x86上的unsigned char
。 -
如果非指针类型的第7行和第8行的赋值为Ok,为什么第10行和第11行的指针类型会抛出错误?
此外,如果C = U
成功而不需要演员?
首先,重要的是强调char
, signed char
和unsigned char
都是不同的类型 。 C ++ 11 Standard的4.10节定义了不同类型的指针之间的三种可能的标准指针转换:
1。 空指针常量是整数类型的整数常量表达式(5.19)prvalue,其计算结果为零或类型为std :: nullptr_t的prvalue。 空指针常量可以转换为指针类型; 结果是该类型的空指针值,并且可以与对象指针或函数指针类型的每个其他值区分开。 这种转换称为空指针转换。 相同类型的两个空指针值应相等。 将空指针常量转换为指向cv限定类型的指针是单个转换,而不是指针转换的序列,后跟限定转换(4.4)。 可以将整数类型的空指针常量转换为std :: nullptr_t类型的prvalue。 [注意:生成的prvalue不是空指针值。 - 尾注]
这是不相关的,因为我们这里没有nulltptr_t
类型的空指针。
2。 类型为“指向cv T的指针”的prvalue,其中T是对象类型,可以转换为类型为“指向cv void的指针”的prvalue。 将“指向cv T的指针”转换为“指向cv void的指针”的结果指向T类型的对象所在的存储位置的开始,就好像该对象是类型T的最派生对象(1.8) (即,不是基类子对象)。 空指针值将转换为目标类型的空指针值。
这不适用,因为目标类型不是void
。 最后,
3。 类型为“指向cv D的指针”的prvalue,其中D是类类型,可以转换为类型为“指向cv B的指针”的prvalue,其中B是D的基类(子句10)。如果B是D不可访问(第11条)或模糊(10.2)基类,需要这种转换的程序是不正确的。 转换的结果是指向派生类对象的基类子对象的指针。 空指针值将转换为目标类型的空指针值。
signed char
不是一个基类的char
,所以也不适用。
因此,无法执行从signed char
到char
的隐式标准指针转换。
另一方面,根据第4.7段中的规定,允许在整数类型的值之间进行转换。
C ++没有自动指针转换,分配每一侧的指针类型都无关紧要,如果它们不同,则需要转换。
char
是unsigned char
和signed char
的不同类型。 它只能保证对其中一个具有等价值表示,但它仍然是一种独特的类型。 因此,您无法将unsigned char*
或signed char*
为char*
(即,除非使用reinterpret_cast
)。 C ++只是不允许像这样的不同类型之间的指针转换,因为那样一种类型可以伪装成另一种类型。
但是,从unsigned char
或signed char
到char
的转换完全没问题,因为它只涉及其值的转换。
以这种方式考虑:你可以将int
转换为float
,但是你不能将int*
转换为float*
。
我可能是错的,但如上所述,当你指定“C = S; C = U;”时,C ++会自动转换它,有点像你做“char x =”h“; printf(”%i“,x );”。 但是,指针指向内存中的特定位置,并且该位置具有大小。 因此,虽然转换类型只是从不同的角度查看值,但指向不同的值可能涉及更改指向的值的大小。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.