深入理解C語言中指針常量和常量指針
前言
指針常量和常量指針是兩個完全不同的概念,其核心是表示不同內(nèi)存訪問權(quán)限。
const
const關(guān)鍵詞用于定義一個常量為只讀的,它表示該變量的值在初始化后不能被修改。
常量指針
常量指針是指指向常量的指針,其本質(zhì)是指針。常量指針的指針本身可以改變,但不能通過該指針修改所指向的值。

常量指針形式有兩種:
const 數(shù)據(jù)類型 *指針名 數(shù)據(jù)類型 const *指針名
例如:
const int *ptr;
在這個聲明中,ptr是一個指向int型常量的指針。但由于有const的修飾,ptr指向的常量在初始化之后在哪讀取,不能修改。
示例代碼:
#include <stdio.h>
void main() {
int a = 10;
int b = 20;
const int *ptr = &a;
printf("ptr: %d\n", *ptr);//輸出10
ptr = &b;
printf("ptr: %d\n", *ptr);//輸出20
//*ptr++; //錯誤:常量指針不能通過指針修改其指向的值
//*ptr=30; //錯誤:常量指針不能通過指針修改其指向的值
}
在這個示例中,指針前后分別指向了a和b的地址,既指針本身是可以改變的,但我們只能去讀取這個值,無法通過指針來修改指針指向常量的值。
*ptr++; *ptr=30;
這里有兩個新手容易出現(xiàn)的誤區(qū)
指針可以改變的意思是,指針指向的地址可以改變,地址改變既指向的內(nèi)容也會改變,并不是值指針改變了,還是指向同一個常量。
常量指針指向的值只是不能夠通過指針改變,并不代表該變量不能改變。
int a=10; const int *ptr=&a; *ptr++;//不合法,不允許的 a++;//合法的,可以的
不能通過ptr指針修改a的值,但a可以自己去修改
指針常量
指針常量是指針本身是常量,即指針一旦初始化后就不能改變其指向。

指針常量其形式是:
數(shù)據(jù)類型 *const 指針名
例如:
int * const ptr;
在這個示例代碼中,ptr是一個指針常量,其ptr指向的地址是不能改變的,但其指向的值是可以改變的。
示例代碼:
#include <stdio.h>
int main() {
int a = 10;
int b = 20;
int * const ptr = &a;
printf("ptr: %d\n", *ptr); //輸出: 10
*ptr = 30; // 賦值30
printf("ptr: %d\n", *ptr); //輸出: 30
// ptr = &b; // 錯誤:ptr是指針常量,初始化確定了其指向地址就不能二次賦值或修改
return 0;
}
在這個示例中,指針常量ptr初始化是指向a的,我們可以通過*ptr修改其指向數(shù)值的值,但不能修改ptr指向的地址,既該指針指向的地址視為一個常量,不可再修改。
常量指針常量
將常量指針和指針常量復(fù)合,既初始化之后,指針指向的地址及其指向的值,均只能讀取,不能修改。其形式為:
const 數(shù)據(jù)類型 * const 指針名;
例如:
const int * const ptr;
示例代碼:
#include <stdio.h>
int main() {
int a = 10;
const int * const ptr = &a; // ptr 是指向a的常量指針常量
printf("ptr: %d\n", *ptr); // Output: 10
// *ptr = 30; //錯誤:ptr指向的值不能修改
// ptr = &b; // 錯誤:ptr指向的地址不能修改
return 0;
}
總結(jié)
常量指針和指針常量最重要的是其訪問權(quán)限,一句話概括就是:常量指針指針地址可改,指向的值只能讀;指針常量指針地址不可改只能讀,指向的值可以改。
到此這篇關(guān)于深入理解C語言中指針常量和常量指針的文章就介紹到這了,更多相關(guān)C語言指針常量和常量指針內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Ubuntu18.04下QT開發(fā)Android無法連接設(shè)備問題解決實現(xiàn)
本文主要介紹了Ubuntu18.04下QT開發(fā)Android無法連接設(shè)備問題解決實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-06-06
排列和組合算法的實現(xiàn)方法_C語言經(jīng)典案例
下面小編就為大家?guī)硪黄帕泻徒M合算法的實現(xiàn)方法_C語言經(jīng)典案例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-09-09
一文詳解如何實現(xiàn)QT的多語言切換(靜態(tài)+動態(tài))
這篇文章主要給大家介紹了關(guān)于如何實現(xiàn)QT的多語言切換(靜態(tài)+動態(tài))的相關(guān)資料,Qt是一款跨平臺的C++應(yīng)用程序開發(fā)框架,提供了一套豐富的工具和類庫來簡化應(yīng)用程序開發(fā),文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-06-06
使用設(shè)計模式中的單例模式來實現(xiàn)C++的boost庫
這篇文章主要介紹了使用設(shè)計模式中的單例模式來實現(xiàn)C++的boost庫的方法,其中作者對線程安全格外強調(diào),需要的朋友可以參考下2016-03-03
詳解C++編程中的靜態(tài)成員與可變數(shù)據(jù)成員
這篇文章主要介紹了詳解C++編程中的靜態(tài)成員與可變數(shù)據(jù)成員,是C++入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下2016-01-01

