关于指针声明

时间:2011-10-04 11:45:04

标签: c

我正在玩指针而且无法理解为什么这个声明很好

char *ptr = "Hey"

但这是错误的

int  *ptr = 10;

任何人都可以解释一下吗?

7 个答案:

答案 0 :(得分:7)

正确的类比是以下两个错误:

char * p = 'a';  // error
int  * q = 123;  // error

在这里,您尝试将某种类型的值分配给变量,该变量是指针到该类型的变量。

相比之下,以下是正确的:

int  tmp_a[] = { 10, 20, 30 };
char tmp_b[] = { 'h', 'e', 'l', 'l', 'o', '\0' };

int  * p = tmp_a;
char * q = tmp_b;

字符串文字"hello"是一个匿名的只读字符数组,内容与tmp_b相同,因此可以将其解释为指向其第一个元素的指针。由于字符数据是只读的,因此正确的定义应为:

const char * r = "hello";  // r[0] - r[5] have the same value as q[0] - q[5]

答案 1 :(得分:4)

简单地说10不是int*,而是int。您不能将int指定给指针,因为它们是不同的东西。

代码char *ptr = "Hey"成功,因为字符串文字与char*指针兼容。

但请注意,char *ptr = "Hey"具有使ptr指向字符串文字的效果。字符串文字通常存储在只读内存中,因此任何修改它们的尝试都会失败。所以你最好写const char *ptr = "Hey"

答案 2 :(得分:1)

C中的字符串定义为char *。否则,如果您想要一个字符,请使用char var = 'x';

int *ptr = 10; "错误",它合法地将您的指针设置为地址' 10',在大多数情况下(如果不是所有的情况,超出了你的应用程序的内存范围。

答案 3 :(得分:0)

在C中,"Hey"被定义为一个匿名的字符数组,因此分配内存来存储字符值(其中四个,也有一个空终止符)。

此外,您只能指向内存中的内容。所以char *可以指向匿名的字符数组。

10只是一个值。它没有分配内存。你无法获得不在内存中的东西的地址。所以int *失败了。

要使第二个工作,你需要分配一些内存:

int value = 10;
int *ptr = &value; // value is in memory so we can point to it

答案 4 :(得分:0)

在第一种情况下,"Hey"是一个字符串文字,它的类型为char *。因此,可以通过这种方式初始化ptr。话虽如此,真的应该如下所示,因为字符串文字无法写入:

char const * ptr = "Hey";

另一方面,你声明了类似的东西:

int * ptr = ...;

您定义一个指向整数的指针。由于10是一个普通的整数常量,它不是现有的int对象,你不能指向它。但是,你可以这样写:

int intValue;
int * ptr = &intValue;

在这种情况下,intValue是您可以指向的对象。

答案 5 :(得分:0)

请记住,像"Hey"这样的字符串文字是特殊的。它们存储在内存中,并且是不变的。

指定"Hey"的指针实际上会在常量中创建该字符串,并将ptr的地址分配给int* ptr

但是,如果您有10,则分配到10将分配地址10,而您的意思是值为{{1}}的整数的地址。

答案 6 :(得分:0)

说得简单。当编译器在

中看到字符串“Hey”时
char *ptr = "Hey"

编译器将保存字符Hey加上内存中的零终止字节,然后它将用指向字符串中第一个字符的指针替换“Hey”字符串。

int  *ptr = 10;

它不会将10转换为指针。它会将10视为整数,并抱怨它与ptr的类型不同 - 指向int的指针。