1. 程式人生 > >【C++】 char*,const char*(char const *) ,char* const

【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