指針常量和常量指針的區別


1、指針常量——指針類型的常量(int *const p)
本質上一個常量,指針用來說明常量的類型,表示該常量是一個指針類型的常量。在指針常量中,指針自身的值是一個常量,不可改變,始終指向同一個地址。在定義的同時必須初始化。用法如下:

int a = 10, b = 20;
int * const p = &a;
*p = 30; // p指向的地址是一定的,但其內容可以修改
2、常量指針——指向“常量”的指針(const int *p, int const *p)
常量指針本質上是一個指針,常量表示指針指向的內容,說明該指針指向一個“常量”。在常量指針中,指針指向的內容是不可改變的,指針看起來好像指向了一個常量。用法如下:

int a = 10, b = 20;
const int *p = &a;
p = &b; // 指針可以指向其他地址,但是內容不可以改變
3、例題
(1)

int main() {
int m = 10;
const int n = 20; // 必須在定義的同時初始化

const int *ptr1 = &m; // 指針指向的內容不可改變
int * const ptr2 = &m; // 指針不可以指向其他的地方

ptr1 = &n; // 正確
ptr2 = &n; // 錯誤,ptr2不能指向其他地方

*ptr1 = 3; // 錯誤,ptr1不能改變指針內容
*ptr2 = 4; // 正確

int *ptr3 = &n; // 錯誤,常量地址不能初始化普通指針嗎,常量地址只能賦值給常量指針
const int * ptr4 = &n; // 正確,常量地址初始化常量指針

int * const ptr5; // 錯誤,指針常量定義時必須初始化
ptr5 = &m; // 錯誤,指針常量不能在定義后賦值

const int * const ptr6 = &m; // 指向“常量”的指針常量,具有常量指針和指針常量的特點,指針內容不能改變,也不能指向其他地方,定義同時要進行初始化
*ptr6 = 5; // 錯誤,不能改變指針內容
ptr6 = &n; // 錯誤,不能指向其他地方

const int * ptr7; // 正確
ptr7 = &m; // 正確

int * const ptr8 = &n;//錯誤常量地址真能修飾常量指針
*ptr8 = 8;//錯誤

return 0;
}
(2)判斷下面程序對錯,並說明理由

int main()
{
char * const str = "apple";
* str = "orange";
cout << str << endl;
getchar();
}
錯誤

"apple"是字符串常量放在常量區,str指向"apple",那么str指向的是字符串常量"apple"的首地址,也就是字符a的地址,因此str指向字符a,*str就等於字符a,對*str的修改就是對字符串首字符a的修改,但"apple"是一個字符串常量,常量的值不可修改。

根據字符串賦值規則,可以修改整個字符串,方法是對指向字符串的指針str進行賦值,如下:

str = "orange";
但依舊是錯誤的,在該賦值語句中,系統會在常量區一塊新的空間寫入字符串"orange"並返回其首地址,此時str由指向字符串常量"apple"的首地址變為指向字符串常量"orange"的首地址,str指向的地址發生了變化,但str是指針常量不能被修改,所以錯誤。

如果想要程序編譯通過,就不能將str聲明為指針常量,否則str在初始化之后就無法修改。因此將const修飾符去掉,並修改字符串賦值語句,修改后程序如下:

int main()
{
   char * str = "apple";
   str = "orange";
   cout << str << endl;
   getchar();
}

原文鏈接:https://blog.csdn.net/qq_36132127/article/details/81940015


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM