问题描述
可能我对指针的概念尚不清楚,但我对此表示怀疑。对于整数指针
# include <stdio.h>
int main()
{
int a = 4;
int *b = &a;
*b = 6;
printf("%d",*b);
}
打印
6
但用于字符指针
char *str = "Hello";
*str = "Hlw";
给出错误 但是
char *str = "Hello";
str = "Hlw";
工作。那么,为什么它如此工作?
解决方法
字符串文字是const char[]
数组,它衰减为指向字符串的第一个const char*
的{{1}}指针。
char
在C中以及从C ++到C ++ 03都是合法的,但在C ++ 11及更高版本中是非法的。现代版本不允许将char *str = "Hello";
指针分配给非const const char*
指针(无显式类型转换,可以)。
就像您的char*
示例中的*b
访问单个int*
一样,int
也访问单个*str
。因此,char
试图将*str = "Hlw";
指针分配给单个const char*
,这就是为什么编译失败的原因。
char
只是将str = "Hlw";
的指针分配给const char*
,使其指向不同的内存地址(如果合法)。就您的str
示例而言,这与执行此操作相同:
int*
,
通过int*
间接访问时,您将获得int
的左值。 int
是整数。
通过char*
间接访问时,您将获得char
的左值。 char
不是字符串。它是一个单一字符(假设使用固定宽度字符编码而不是unicode)。
这里的核心区别是字符串是字符数组,而整数不是数组。
str = "Hlw";
这在C ++中格式不正确,因为字符串文字是const char的数组,并且该数组不会隐式转换为指向非const char的指针。
,指针没有指向指向单个对象还是指向数组成员的信息。
在此代码段中
int *b = &a;
*b = 6;
指针p
指向类型为int
的对象,因此,如果取消引用指针,则可以访问该对象。
在此代码段中
char *str = "Hello";
*str = "Hlw";
指针str
指向类型为char
的对象。它指向字符串文字"Hello"
的第一个字符。因此,取消对指针的引用,就可以访问指针所指向的字符串文字的第一个字符。
因此而不是这种不正确的分配
*str = "Hlw";
在C中,左侧操作数的类型为char
,而在C中,右侧操作数的类型为char[4]
,而在C ++中,右侧的操作数的类型为const char[4]
,您应该编写类似的内容
*str = 'G';
也就是说,您可以将字符文字分配给char
类型的对象。您不能将字符串文字分配给char类型的对象,例如
char c = "Hello";
和表达式*str
确实具有类型char
。
在此代码段中
char *str = "Hello";
str = "Hlw";
您要重新分配指针str
本身,而不是它所指向的对象。
在声明之后,指针str指向字符串文字"Hello"
的第一个字符,即字符'H'
。
在以下语句中,指针str
由字符串文字"Hlw"
的第一个字符的地址重新分配。现在的ijs指向此字符串文字的字符'H'
。
*b
可以用b[0]
代替,因为在C语言中,指向任何事物的指针也是该类型一个元素的数组。这样做有助于理解问题:
int a = 4;
int *b = &a;
b[0] = 6; //<=== this is correct because b is an array of int
char *str = "Hello";
str[0] = "Hlw"; //<=== but this is not as explained by other answers