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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言,用指针方式定义的字符串为啥不能修改?相关的知识,希望对你有一定的参考价值。

char * p = "123";
*p = '0';//这样会出错

我并没有用const啊

"123"本身默认的就是一个字符串常量,他的值不容修改,p只是一个指针,执行该字符串的首地址,对该地址的值指向的地址空间的值的改变也是不允许的。 参考技术A 我也是今天在想这个声明模式跟char p [ ]="123";之间的区别时琢磨的。二维数组int a [ i ] [ j ],当把二维数组看成一维数组时声明指针变量是这样声明的:int *p=a[ i ],这个时候p指向的是元素类型为int型的一维数组的第一个元素;当以指针方式定义字符串的时候,同样的道理,指针p指向的是元素类型为字符数组的数组(大致如:a[ 0 ][ 0 ]=123,p=a[ 0 ]),此时p指向元素“123”的第一个元素‘ 1 ’。当以*p=‘0’这种方式赋值的时候相当于把char类型的值赋值给数组类型的变量!不知道说的够不够明白,第一次回答问题;碰巧我也在研究这个问题,搜了之后点进来发现你的问题跟我一样。只是自己的一点未经别人证实的想法。但至少让我不在这个问题上纠结。。。 参考技术B 我的天啊!

char * p = "123";这是字符串类型的

然而
*p = '0';//这样会出错
你直接负一个字符给他,当然报错追问

……我想你们理解错了啊……或者是我没说清楚吧。
我并不是要做对比,第二句是接在第一句之后的。
也就是说,这是在同一个函数中的两句,
我的目的是修改第一个字符。

参考技术C 根据C语言标准:字符串常量存储在同一位置,修改字符串常量可能造成其他程序字符串的修改;
ANSI C则声明如果对一个字符串常量进行修改,其效果是为定义的。它允许编译器把一个字符串常量存储于一个地方,即使它在程序中多次出现。这就使得修改字符串常量变得极易危险,因为对一个常量进行修改可能殃及程序中其他字符串常量。因此,许多编译器不允许修改字符串常量,或者提供编译选项,让你自行选择是否允许修改字符串常量。在实践中,请避免这样做,如果修改字符串,请把它存储于数组中。(摘自C语言标准)

C语言中关于结构体指针为啥不能在函数内赋初值的问题?

#include<stdio.h>
struct st

int num;
st1 = 1 , st2;
struct st1*pst1;
pst1 = &st1;//这一行为什么放在main外面,下面的pst1->num的pst1不会有下波浪线报错(我用的vs2017)
void main()
printf("%d", pst1->num);

struct st1*pst1; //问题在这句,这个指针pst1指向的类型是st1,而不是st,所以pst1 = &st1是不可以的,自然 pst1->num也就不对了
#include<stdio.h>
struct st

int num;
st1 = 1 , st2;
struct st*pst1; //是st*,而不是st1*

void main()
pst1 = &st1; //放在局部,全局区是不能赋值的
printf("%d", pst1->num);
追问

请问是不是说struct st这个st如果不定义的话,结构体指针要想定义就必须用typedef定义结构体是这个意思把?

追答

struct st 的意思是定义了一个叫st的类型

struct st

int num;
st1 = 1 , st2; //这个就是定义了两个st类型的变量,这两个变量名叫st1,st2
struct st* pst1; // 定义了一个指向st类型变量的指针
struct st1* pst1; // 定义了一个指向st1类型变量的指针,你的代码里不存在st1类型
pst1 = &st1 //st1的类型是st,所以&st1的类型就是st* , 而不是st1*

就像int一样
int int1; //int是类型,int1是int类型的变量

参考技术A 赋值语句属于执行语句,必须写在函数体里,不能写在全局区。追问

但是写在主函数里会有这样的错误提示啊:
printf()里的“num”的左侧部分指定未定义的结构/联合“st1”

追答

struct st1*pst1;
这一行应该是struct st *pst1;

参考技术B

类型和变量名是不同的,要区分开来

以上是关于C语言,用指针方式定义的字符串为啥不能修改?的主要内容,如果未能解决你的问题,请参考以下文章

在C语言中能否直接给指针指向的数据赋值?为啥?

如何用C语言文件操作修改指定文件

为啥C语言输出文件内容乱码

定义了一个常数组,为啥能用指针改变数组元素的值?

c语言计算字符串的长度(用指针)

c++中为啥要用new 函数()实现多态?