標籤:const 指標 結構體
(6)const的使用
c中的const表達著“常量”的意思,更準確地說是“read-only”(唯讀)的含義。當const與指標相遇時,由於其與*的相對位置不同,會產生不一樣的效果。
舉例說明
(1)const位於*的左側
如,const int *p;此時等同於int const *p;
此時,const的含義體現在:*p是唯讀。
(1)const位於*的右側
如,int *const p;
此時,const的含義體現在:p是唯讀。
實驗驗證
int main(){int foo = 1;int bar = 2;const int *pa = &foo;int *const pb = &foo;//嘗試修改值*pa = 2; //編譯器報錯:“表達時必須是可修改的左值”pb = &bar; //編譯器報錯:“表達時必須是可修改的左值”return 0;}
此時,添加語句*pa=2;會報錯,因為*pa是唯讀,不可更改;pb=&bar;同樣會報錯,因為pb是唯讀,不可更改。
上面提到,const的本意是“唯讀”,而並非“常量”。通過一些方法,可以更改它的值。
int main(){const int foo = 1;printf("foo...%d\n", foo);int *pa = &foo; //這裡有警告,但仍可運行*pa = 2;printf("foo...%d\n", foo);system("pause");return 0;}
運行
從結果看,成功更改了本已聲明為唯讀foo。這段代碼,在c中編譯只是有警告,在cpp下編譯直接出錯。不知還有沒有其它的方法,大家可推薦下。
const與結構體類型相遇,此時const會const到什麼程度?
typedef struct{char *name;char *address;int age;}Person;void setPerson(const Person* pPer){/*以下方式會出錯!pPer->name = "David";pPer->address = "BeiJing";pPer->age = 22;*/strcpy(pPer->name, sizeof("David"), "David");strcpy(pPer->address, sizeof("BeiJing"), "BeiJing");}int main(){Person per;char name[10] = "zx";char address[20] = "QiChun";per.name = name;per.address = address;per.age = 24;printf("per.name...%s\n", per.name);printf("per.address...%s\n", per.address);printf("per.age...%d\n", per.age);printf("update..\n");setPerson(&per);printf("per.name...%s\n", per.name);printf("per.address...%s\n", per.address);printf("per.age...%d\n", per.age);return 0;}
運行
編譯時間無任何警告,從運行結果看,const修飾符起到的作用是這樣的:
若直接初始化 per = { "zx", "QiChun" };則在setPerson()方法中,修改name和address所指向的內容也是不可以的。這裡的原因不是因為const,而是"zx"和"QiChun"都是常量字串。一般情況下,常量字串都位於記憶體中的唯讀地區,本身是不可修改的。故在代碼中,我們選擇申請棧空間。
專欄目錄:C指標
娓娓道來c指標 (6)const的使用