2015-12-29 160 views
-5

当我们写char *str="john"; 没有错误会出来,但是当我们写 int *ptr=50; 错误会出来这样 "Invalid conversion from int to int *".C指针,指向和字符串

为什么这种差异? 为什么我们需要使用指针来存储string s,而我们不需要(不能使用)指针来存储int s?

+3

有什么可说的? 50不是指针; '“约翰”是一个指针。其中一个大部分是正确的(类型应该是'const char *');另一个是不正确的。 –

+2

回答自己:'50'和''你好''有哪些类型? – Olaf

+1

'请快速回答。'..嗯..怎么样一个DCV呢? –

回答

0

"john"返回指向字符串常量john的第一个字母的指针。

由于char * str需要pointer to char,声明char *str="john";不会给出任何警告。


50返回值50本身。

int * p需要一个pointer to int,但它会得到一个int50。所以它给人的警告Invalid conversion from int to int *

2

所有参考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*类型的左值对象是合法的,因为从intint*的转换是隐含执行的(第6.5.16.1节 ¶1),但是您的编译器不符合标准并因某种原因拒绝。

+0

一个指针可以被转换为一个整数,这是隐式完成的。但是结果是实现定义的,不保证是可用的,并且在大多数情况下并非意图使用。因此只是一个警告,而不是一个错误。 – Olaf

+0

详细信息:字符串文字将被写入内存中的字符串表,地址将返回到指针。 – ForeverStudent

+0

@FUZxxl - 6.5.16.1 1在*赋值时不允许从'int'到'int *'的隐式转换;如果左操作数具有指针类型,则右操作数必须是指向兼容类型的*指针,指向“void”的指针或空指针常量。'int * ptr = 50;'是违反约束的。 –