微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在C或C ++中将字符串重新分配给字符指针

如何解决在C或C ++中将字符串重新分配给字符指针

可能我对指针的概念尚不清楚,但我对此表示怀疑。对于整数指针

# 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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。