【C++】 char*,const char*(char const *) ,char* const

const char*,封禁星号,值不能变,但可以变地址;

char* const,封禁地址,地址不能变,而且值也不能变。值不能变是因为char*不支持变量修改,所以这个值就怎么也不能变。相当于该变量是一个固定内存中存了一个不可改变的字符串,地址和字符串都不能变。这个字符串可以赋值给char*,却不能赋值给char[],我认为是由于C++自己定义时就确定了char*不可变,char[]可变,所以char*可以编译通过。现在C++加入了STL新标准,可以赋值给string类型,但是如果要修改这个字符串,将会编译不通过。

const char*和char*区别

const char*是指向常量的指针,而不是指针本身为常量,可以不被初始化.该指针可以指向常量也可以指向变量,只是从该指针的角度而言,它所指向的是常量,通过该指针不能修改它所指向的数据。

1.const char*是不能直接赋值到char*的,这样编译都不能通过,理由:假如可以的话,那么通过char*就可以修改const char指向的内容了,这是不允许的.所以char*要另外开辟新的空间。

#include <iostream>
using namespace std;
int main(){
    const char* cpc="abcde";
    char* pc=new char[100];
    strcpy(pc,cpc);
    cout<<pc<<endl;

    return 0;
} 


2.char*到 const char*直接赋值就可以了

#include "iostream"
#include "string"
using namespace std;

int main()
{
    const char* cpc;

    char* pc="abcde";

    //pc[1] = '2';这种操作是不行的,根本没有这种字符串的操作,而不是因为const的原因

    cpc=pc;

    pc = "123";

    cout << cpc << endl;
    cout << pc << endl;

    return 0;
}

结果为:

小结:cpc指向了"abcde",然后将指针赋值给了pc,这时对cpc进行了修改,相当于cpc重新指向了新的常量"123",但这时pc还是指向"abcde"没有改变。

指针常量char* const,常量指针const char*(也可以写成char const *)

我觉得记这个好麻烦,不如这样记:

指针常量,分开就是“指针”+“常量”,指针char* ,常量const。接着就可以用开头的记法,它是封禁地址

常量指针,分开就是“常量”+“指针”,常量const,指针char*。依旧用开头提到的记法,这是封禁星号,也就是值不能变

1. 什么是指针常量?指针常量即指针类型的常量。例:

char *const name1="John";

name1="abc"; //错误,name1指针,不能变,一个指针类型的变量,存放的是地址,所以不能把'"abc"的地址赋给name1
char * name2= name1; //可以

2. 什么是常量指针?常量指针即是指向常量的指针,指针的值可以改变,指针所指的地址中的内容为常量不能改变,例:

const char *name1="John";

char s[]="abc"; name1=s; //正确,name1存放的地址可以改变
char* name2= name1; //不正确

我的理解就是:name1不能给name2赋值,不能很好的解释const的作用。因为char*本身就是不能修改的,所以就算我将name1赋值给name2也没有关系,毕竟name2又不能修改。那么我们再看看const char*的定义“封禁星号,不能改变值”,我上面提到的不管name1和name2都不能被修改,那const限定岂不是很鸡肋。

但是我们得知道const不仅仅用于限定char*,还有int*等等。我们不妨看看int*的例子:

#include "iostream"
#include "string"
#include "string.h"
using namespace std;

void change(char *source){

    source[0] = 'D';

    cout<<source<<endl;
}

int main()
{
    int _a = 1;
    const int* a = &_a;
    int* b = &_a;
    b[0] = 4;

    //int* c = a;//这里直接编译不通过,也就是加了const,不能使用赋值操作

    cout<<*a<<endl;
    cout<<b[0]<<endl;
    //cout<<c[0]<<endl;

    return 0;
}

结果为:

从结果可以看出,a是指向_a的地址,b也是指向_a的地址,这是修改b是不受const的限制,毕竟我又没指向a。有一行被我注释掉的int* a=c;这句代码,这句会直接报错,假如可以的话,那么通过修改int*的内容就可以修改const int*指向的内容了,这显然是不允许的。

转自:https://www.cnblogs.com/songchaohuang/articles/5591576.html

猜你喜欢

转载自blog.csdn.net/u013066730/article/details/84144797