C語言中指針常量和常量指針的區別
在面試中我們經常會被面試官問到什麼是常量指針,什麼又是指針常量。
指針常量就是指針本身是常量,指針裡面所存儲的內容(內存地址)是常量,不能改變。但是,對應內存地址裡存的內容是可以通過指針改變的。
常量指針就是指向常量的指針,指針中所存地址中對應的值是常量,不能通過指針來修改它的值。但是,指針自身不是常量,它自身的值可以改變,從而指向另一個地址。
指針常量與常量指針的聲明
指針常量的聲明:數據類型 * const 變量名。
常量指針的聲明:數據類型 const * 變量名 或者 const 數據類型 *變量名。
常量指針常量的聲明:數據類型 const * const 變量名或者 const 數據類型 * const 變量名。
指針常量與常量指針的使用
1.指針常量例子
/*指針常量*/ /*聲明方式*/ int a; int *const b = &a; //const放在指針聲明操作符的右側 /*例子*/ int a=0,b=0; int * const p=&a; p = &b;//錯誤 *p = 5;//正確
2.常量指針例子
/*常量指針*/ /*聲明方式*/ //1) const int *p; //2) int const *p; /*例子*/ int a=0,b=0; int const *p=&a; p = &b;//正確 *p = 5;//錯誤
3.常量指針常量
/*常量指針常量*/ /*聲明方式*/ const int a = 5; const int * const p = &a; //a值不變,b的指向也不能變 /*例子*/ int b = 2; int a = 5; const int * const p = &a; p=&b;//錯誤 *p=2;//錯誤
例
int a = 5; const int b = 6; const int *c = &a; // c是指向整形變量a的常量指針 const int *d = &b; // d是指向整形常量b的常量指針 int *const e = &a; // e是指向整形變量a的指針常量 //int *const f = &b; //報錯提示 無法將const int*賦值給 int * const int *const g = &a; // g是指向整形變量a的指針常量 const int *const h = &b; // h是指向整形常量b的指針常量 printf("a:%d b:%d\n*c:%d c:%d\n*d:%d d:%d\n*e:%d e:%d\n*g:%d g:%d\n*h:%d h:%d\n",a,b,*c,c,*d,d,*e,e,*g,g,*h,h); a=3; c=&b; //改變c的指向為b c值改變 *c改變 //*c=b; //報錯*c是常量 d=&a; //改變d的指向為a d值改變 *d改變 //*d=a; //報錯*d是常量 //e=&b; //報錯 常量指針指向無法改變 *e=2; //此時a的值已經變為2 e值不變 *e改變也就是a值改變 //g=&b; //報錯指針指向無法改變 //*g=1; //報錯指向的地址中的值是個常量無法改變 //h=&a; //報錯指針指向無法改變 //*h=1; //報錯指向的地址中的值是個常量無法改變 printf("改變後\n"); printf("a:%d b:%d\n*c:%d c:%d\n*d:%d d:%d\n*e:%d e:%d\n*g:%d g:%d\n*h:%d h:%d\n",a,b,*c,c,*d,d,*e,e,*g,g,*h,h);
程序的輸出結果:
(可以嘗試一下把代碼中的*e=2註釋掉會發生什麼)
總結:
指針常量,指向地址不可變,地址中的值可通過指針改變
常量指針,指向地址中的值不可通過指針改變,指向可變
常量指針常量,指向和指向地址的值都不可通過指針改變
附加題
指向常量的指針常量該怎麼寫?
答案:
const int * const b = &a;//指向常量的指針常量
到此這篇關於C語言中指針常量和常量指針的區別的文章就介紹到這瞭,更多相關C語言中指針常量和常量指針內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!