我正在玩指针而且无法理解为什么这个声明很好
char *ptr = "Hey"
但这是错误的
int *ptr = 10;
任何人都可以解释一下吗?
答案 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的指针。