与使用指针声明的字符串和c ++中的数组混淆

时间:2019-03-11 15:35:25

标签: c++ pointers

在以下代码中:

using namespace std;

void swap(char *x,char *y){

  char tmp = *x;
  *x = *y;
  *y = tmp;

}

int main(){

 char a[]="ab";
 //char *a ="ab";

 swap( (a+0),(a+1) );
 cout<<a;

 return 0;
}

当数组a初始化为a [] =“ ab”时,交换功能起作用, 但是当将其初始化为* a =“ ab”时,会引发分段错误, 谁能说为什么?

2 个答案:

答案 0 :(得分:3)

char a[]="ab";是本地非常量数组。您可以修改非常量数组。

字符串文字是常量。初始化指向字符串文字的指针时,它指向const对象。修改const对象的行为是不确定的。

即使初始化char *a ="ab";也不正确(自C ++ 11起),因为字符串文字不会隐式转换为指向非常量char的指针。

答案 1 :(得分:0)

这是纯C的概念,阅读C编程语言中的5.5字符指针和函数,您将知道答案。问题是您不能更改字符串常量。