深入理解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)文章
C++設(shè)計模式編程中Facade外觀模式的使用實例解析
這篇文章主要介紹了C++設(shè)計模式編程中Facade外觀模式的使用實例解析,外觀模式的主要用途就是為子系統(tǒng)的復(fù)雜處理過程提供方便的調(diào)用方法,需要的朋友可以參考下2016-03-03C++ normal_distribution高斯正態(tài)分布函數(shù)的用法示例
高斯分布也稱為正態(tài)分布(normal distribution),常用的成熟的生成高斯分布隨機數(shù)序列的方法由Marsaglia和Bray在1964年提出,這篇文章主要給大家介紹了關(guān)于C++ normal_distribution高斯正態(tài)分布函數(shù)用法的相關(guān)資料,需要的朋友可以參考下2021-07-07QT quick-Popup彈出窗口自定義的實現(xiàn)
本文主要介紹了QT quick-Popup彈出窗口自定義的實現(xiàn),文中通過示例代碼介紹的非常詳細,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-07-07C++11中隱式類型轉(zhuǎn)換的實現(xiàn)示例
C++類型轉(zhuǎn)換分為:隱式類型轉(zhuǎn)換和顯式類型轉(zhuǎn)換,本文主要介紹了C++11中隱式類型轉(zhuǎn)換的實現(xiàn)示例,具有一定的參考價值,感興趣的可以了解一下2024-06-06C語言中斐波那契數(shù)列的三種實現(xiàn)方式(遞歸、循環(huán)、矩陣)
本文主要介紹了C語言中斐波那契數(shù)列的三種實現(xiàn)方式(遞歸、循環(huán)、矩陣),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-01-01