c语言中,为啥不能对字符指针变量指向的字符串再赋值?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c语言中,为啥不能对字符指针变量指向的字符串再赋值?相关的知识,希望对你有一定的参考价值。

比如说这段:
char *a="hello";
a[2]='c'; //就是这个语句为什么不正确啊

因为C语言中,凡是以""括住的形式直接出现,而且你又没有为其分配内存空间的字符串都是常量字符串,是不能修改其值的。

这样:

char a[6]="hello";

a[2]='c';

就可以了。

这里你为hello分配了一个长度为6的字符数组空间来存放。

扩展资料:

给字符数组赋值的方法

1、定义的时候直接用字符串赋值

char a[10]="hello";

注意:不能先定义再给它赋值,如char a[10]; a[10]="hello";这样是错误的!

2、对数组中字符逐个赋值

char a[10]='h','e','l','l','o';

3、利用strcpy

char a[10]; 

strcpy(a, "hello"); 

参考技术A 这不是绝对的:当指针指向的字符串是常字符串时当然不能再赋值,因为目标是“常量”,而当指针指向的字符串不是常字符串时就可以再赋值,比如用动态申请内存方法创建的字符串。具体说就是用char *p="abcqer12345";这种方法定义字符串是不能通过指针改变内容的,原因是这个定义确定了abcqer12345是字符串常量——因为char *p="abcqer12345";被编译器解释为“创建一个字符串常量abcqer12345,并把它的首地址(就是a的地址)赋给char *型指针p”——既然是“常量”,自然就不能更改。 参考技术B C语言中,凡是以""括住的形式直接出现,而且你又没有为其分配内存空间的字符串都是常量字符串,是不能修改其值的。

char a[6]="hello";
a[2]='c';
就可以了。这里你为hello分配了一个长度为6的字符数组空间来存放。本回答被提问者采纳
参考技术C char*
a="hello"为什么不能修改,这个要涉及进程占用的内存分段,大概分为代码区,只读区,全局区,堆区,栈区。"hello"作为一个字符串字面值,是被放在只读区,只读顾名思义就是不能修改的。char*
a="hello",相当于把hello的地址赋给了a,故而不能对a指向的内容进行修改。char
a[]="hello",这样赋值的就是一个字符数组。字符数组a是在栈区里申请的一个空间给a,然后把只读区的"hello"进行了一次复制再赋值给a,这样a的指向是能修改的。
参考技术D 不能修改!
char *p="hello";
相当于 const char *p="hello"
以这种方法初始化的字符串是常量字符串,而系统默认对常量赋初值后,其值无法被修改,否则会报错,所以不能修改。

c语言常量指针赋值给变量指针导致警告


常量指针定义:常量是形容词,指针是名词,以指针为中心的一个偏正结构短语。这样看,常量指针本质是指针,常量修饰它,表示这个指针乃是一个指向常量的指针。指针指向的对象是常量,那么这个对象不能被更改。常量指针的使用要注意,指针指向的对象不能通过这个指针来修改,可是仍然可以通过原来的声明修改,也就是说常量指针可以被赋值为变量的地址,之所以叫做常量指针,是限制了通过这个指针修改变量的值。

在C/C++中,常量指针是这样声明的:

1)const int *p;

2)int const *p;

例子:

int a = 5;

const int b = 8;

const int *c = &a; // 这是合法的,非法的是对c的使用

*c = 6; // 非法,但可以这样修改c指向的对象的值:a = 6;

const int *d = &b; // b是常量,d可以指向b,d被赋值为b的地址是合法的

我在这里想重点说明的是,在一个函数的定义里,将一个常量指针赋值给变量指针,然后通过这个变量指针是可以修改常量指针指向的对象的。

但是,编译器会给出一个警告:warning: assignment discards ‘const’ qualifier from pointer target type [-Wdiscarded-qualifiers]
  p=a;
   ^
void testp(const int *a,int n)
{
  int *p;
  p=a;
  p[0]=12;     //修改了数组a[0]的值,而编译器只是给了一个警告,所以,警告也要足够重视。
  a[0]=12;     //直接修改a,编译器会报错,因为定义了const属性。
}

以上是关于c语言中,为啥不能对字符指针变量指向的字符串再赋值?的主要内容,如果未能解决你的问题,请参考以下文章

C语言,用指针方式定义的字符串为啥不能修改?

c语言char和int可以互相赋值,但指针不能赋值,char *和int *不能直接赋值,为啥呢?谢谢

在C语言编程中,为啥要将指针变量在开始的时候赋值为NULL?

求解答C语言“指针赋值”?

c语言赋值是啥?

C语言指针变量为啥要赋初值?