使用指针算术修改字符串文字或字符数组[重复]
Posted
技术标签:
【中文标题】使用指针算术修改字符串文字或字符数组[重复]【英文标题】:Modifying string literals or char arrays with pointer arithmetic [duplicate] 【发布时间】:2022-01-09 01:26:54 【问题描述】:我知道char* pString
是只读的,因此pString[0]='A'
会给出分段错误,但为什么pString2[0]='A'
在下面的代码中工作:
char* pString = "abcdefg";
char tmpStr[80];
strcpy(tmpStr, pString);
char* pString2 = tmpStr;
//pString[0] = 'A'; // gives segmentation error since string literal is read-only.
pString2[0] = 'A'; // why this one works?
【问题讨论】:
pString2
指向(非常量)数组tmpStr
的第一个元素。您可以随意修改tmpStr
的内容,直接使用数组或通过像pString2
这样的指针。
【参考方案1】:
pString2
未指向字符串文字。它指向char
数组的第一个元素,而该数组不是const
,因此允许写入。
【讨论】:
【参考方案2】:在此声明中
char* pString = "abcdefg";
字符串文字是记录"abcdefg"
,而不是声明的指针。
C 中的字符串文字的类型为char[8]
。尽管在类型中没有限定符const
,但是您不能更改字符串文字。任何更改字符串文字的尝试都会导致未定义的行为。
在 C++ 中,与 C 字符串文字相对的是常量字符数组类型。
至于声明的指针则指向字符串字面量的第一个元素。
在这段代码中sn-p
char tmpStr[80];
strcpy(tmpStr, pString);
声明了字符数组tmpStr
。您可以更改数组。
在此声明中
strcpy(tmpStr, pString);
字符串文字的元素被复制到字符数组中。
并且在声明下面声明的指针指向数组的第一个元素。
char* pString2 = tmpStr;
pString2[0] = 'A';
所以你可以改变数组。您甚至可以使用指针 pString
而不是 pString2 之类的
pString = tmpStr;
pString[0] = 'A';
请注意,您可以使用字符串字面量初始化字符数组。所以你可以写例如
char tmpStr[] = "abcdefg";
*tmpStr = 'A';
或
tmpStr[0] = 'A';
【讨论】:
以上是关于使用指针算术修改字符串文字或字符数组[重复]的主要内容,如果未能解决你的问题,请参考以下文章
最小栈(栈设计)删除有序数组中的重复项(数组双指针)最大数(贪心字符串)