当我们写char *str="john";
没有错误会出来,但是当我们写 int *ptr=50;
错误会出来这样 "Invalid conversion from int to int *".
C指针,指向和字符串
为什么这种差异? 为什么我们需要使用指针来存储string
s,而我们不需要(不能使用)指针来存储int
s?
当我们写char *str="john";
没有错误会出来,但是当我们写 int *ptr=50;
错误会出来这样 "Invalid conversion from int to int *".
C指针,指向和字符串
为什么这种差异? 为什么我们需要使用指针来存储string
s,而我们不需要(不能使用)指针来存储int
s?
"john"
返回指向字符串常量john
的第一个字母的指针。
由于char * str
需要pointer to char
,声明char *str="john";
不会给出任何警告。
但50
返回值50
本身。
int * p
需要一个pointer to int
,但它会得到一个int
50
。所以它给人的警告Invalid conversion from int to int *
所有参考ISO 9899:2011“C11”
类型的字符串字面像"john"
的是char[N]
其中N
是字符串的长度(§6.4.5 ¶ 6)。在几乎所有上下文中,数组类型的对象都隐式转换为指向其第一个元素的指针,在本例中为char*
(第6.3.2.1节)。将char*
类型的对象指定给char*
类型的左值是合法的(第6.5.16.1节 ¶¶1)。
像50
这样的足够小的整数文字的类型是int
(§6.4.4.1 ¶¶5)。 int
类型的对象指定为int*
类型的左值对象是合法的,因为从int
到int*
的转换是隐含执行的(第6.5.16.1节 ¶1),但是您的编译器不符合标准并因某种原因拒绝。
一个指针可以被转换为一个整数,这是隐式完成的。但是结果是实现定义的,不保证是可用的,并且在大多数情况下并非意图使用。因此只是一个警告,而不是一个错误。 – Olaf
详细信息:字符串文字将被写入内存中的字符串表,地址将返回到指针。 – ForeverStudent
@FUZxxl - 6.5.16.1 1在*赋值时不允许从'int'到'int *'的隐式转换;如果左操作数具有指针类型,则右操作数必须是指向兼容类型的*指针,指向“void”的指针或空指针常量。'int * ptr = 50;'是违反约束的。 –
有什么可说的? 50不是指针; '“约翰”是一个指针。其中一个大部分是正确的(类型应该是'const char *');另一个是不正确的。 –
回答自己:'50'和''你好''有哪些类型? – Olaf
'请快速回答。'..嗯..怎么样一个DCV呢? –