【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