很多人遇到指針就糊涂,搞不清到底指向什么,其實是你沒搞清楚 * 修飾誰,還有一些關鍵字修飾誰。
看下面的例子,定義一個無符號字符變量x,然后同時定義一個可以指向x的指針p,即可以將x的地址放到指針變量p里面,然后又定義了一個可以存放p地址的指針pp:
很多時候還會遇到const關鍵字,很多人不知道該如何結合,到底const修飾誰?int main(void){//無符號字符變量x,指向無符號字符變量類型的指針p,指向指針類型p的指針pp.unsigned char x,*p,**pp;x=12;p=&x;pp=&p;//const是修飾指針指向的對象屬性,意思是指針kp只能指向一個const常量,而kp可以被修改指向不同的const常量,但是不能通過kp指針修改指向變量的值。int const *kp,k=20,kv=32;kp=&k;kp=&kv;//const是修飾指針mp,mp將指向固定的地址,因此在定義的時候就應該指定好該地址,之后無法修改該指針內的地址。int mv=14;int *const mp=&mv;//可以讓kp指向mv的地址,但是不能通過kp,修改mv的值;kp=&mv;/*總結: const *p 表示*p是一個整體,即指針p指向的某個變量,而const修飾該變量;* const p表示const p是一個整體,const 修飾指針p,即指針p存放的地址不能變。*/printf("*p=%d ",*p);printf("**pp=%d ",**pp);printf(" p=%d ",p);printf("pp=%d ",pp);printf("pp=%d ",&pp);}
這里你可以將定義看成是從右到左的結合。
int const *kp;
int *const mp;
例如例子中的這兩個,你看好了,從右到左
int const (*kp);
int *(const mp);
第一個括號里是表示kp指針指向的某個變量,該變量是個const常量,不可變。
第二個是const直接修飾了指針mp,意思是指針存放的內容是不可變的,就是地址不可變。
*與&是一對逆操作,*的出現用于定義指針,在使用的時候用于通過指針找到指向的變量。
而&用于取出變量的地址。
在PC測試上,推薦一個C語言的IDE,是C語言入門圣經C primer plus上推薦的一款:Pelles C IDE

如果想使用中文界面可以訪問下面這個中文鏈接:https://www.pellesc.cn/
例如一個指向固定地址的指針,若想修改它指向的地址,那么會報錯

上面的報錯信息意思是賦值錯誤,'='的操作數有不兼容的類型'int *'和'int',分配到了固定的地址。該固定的地址是不可以被修改的。
另外需要注意,如果一個變量定義為指向常量的指針,那么該指針還是可以指向一個可變的變量,但是無法通過該指針修改該變量。該變量的屬性就是通過它操作指向的變量都當做不可修改常量看待。
報錯內容如下:


最后奉上,注釋掉不合法的語句后的完整學習代碼
int main(void){//無符號整形變量x,指向無符號整形變量類型的指針p,指向指針類型p的指針pp.unsigned int x,*p,**pp;x=12;p=&x;pp=&p;printf("通過指針p,打印x的值12:*p=%d ",*p);printf("通過指針pp,打印pp存放的指針p指向的變量x的值:**pp=%d ",**pp);printf("打印變量x的地址: &x=%p ",&x);printf("打印指針p存放的變量x的地址:p=%p ",p);printf("打印指針p的地址: pp=%p ",pp);printf("打印指針變量pp的地址: pp=%p ",&pp);printf("-------------------------------------------- ");//const是修飾指針指向的對象屬性,意思是指針kp只能指向一個const常量,而kp可以被修改指向不同的const常量,但是不能通過kp指針修改指向變量的值。int const *kp,k=20,kv=32;kp=&k;printf("通過指針kp訪問固定的數k,*kp=%d ",*kp);kp=&kv;printf("通過指針kp訪問固定的數kv,*kp=%d ",*kp);// 通過kp不可以修改指向地址存放變量的固定值。// *kp=21;//const是修飾指針mp,mp將指向固定的地址,因此在定義的時候就應該指定好該地址,之后無法修改該指針內的地址。int mv=14,mx=24;int *const mp=&mv;printf("通過存放固定地址的指針訪問指向的變量mv=14:*mp=%d ",*mp);*mp=15;printf("通過存放固定地址的指針修改指向的變量mv=15:*mp=%d ",*mp);//可以讓kp指向mv的地址,但是不能通過kp,修改mv的值;kp=&mx;printf("將指向固定數據的指針kp指向一個可以修改的變量mx=24,*kp=%d ",*kp);// 試圖通過指向固定常量的指針kp修改指向的可修改變量mx時候,失敗了。// *kp=25;//因為mp指針指向的地址是const類型,所以下面的操作是非法的,會報錯。// mp=&24;/*總結: const *p 表示*p是一個整體,即指針p指向的某個變量,而const修飾該變量;* const p表示const p是一個整體,const 修飾指針p,即指針p存放的地址不能變。*/}
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
-
指針
+關注
關注
1文章
484瀏覽量
71843 -
CONST
+關注
關注
0文章
45瀏覽量
8761
原文標題:指針的應用,一個簡單例子講清楚你多年的糊涂
文章出處:【微信號:gh_c472c2199c88,微信公眾號:嵌入式微處理器】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
熱點推薦
智能保溫杯CE認證辦理指南
隨著智能穿戴與智能家居產品的發展,智能保溫杯逐漸成為跨境電商熱門產品。若產品出口至 歐盟 市場,必須符合CE認證要求,否則無法合法銷售。
那么,智能保溫杯需要做哪些CE認證項目?下面一次講清楚。
什么是新能源移動充電車?一篇文章講清楚它的類型和原理
隨著全球新能源汽車市場高速發展,傳統的固定充電基礎設施在城市高密度區域、老舊小區以及配電網承載力方面面臨著嚴峻挑戰。在此背景下,新能源 移動充電車 作為一種創新的解決方案快速崛起,其核心優勢在于
企業為什么開始換用 RFID智能硬盤柜?選型標準一次講清楚
在企業的數據資產管理體系中,硬盤一直是非常特殊的一類介質。它體積小、價值高、存儲密度大,一旦丟失或流轉不規范,風險遠高于紙質檔案。本文結合業內廣泛采用斯科兩款機型——CK-GYP?和?CK-GYP1,把企業在選型時真正需要關注的
別再迷糊了!Linux交叉編譯到底是個啥?一文講清楚
很多工程師第一次聽到“交叉編譯”這4個字時,腦袋里往往會冒出兩個字: 抽象 。 明明寫代碼寫得好好的,為啥還要搞一個“交叉”?編譯不就是把源代碼變成可執行程序嗎,難道還會繞幾個彎? 別
一文講清楚TVS二極管的作用和分類
TVS二極管(Transient Voltage Suppression Diode,瞬態電壓抑制二極管)是一種專門用于抑制電路中瞬態過電壓的半導體器件,其核心作用是通過快速響應和低鉗位電壓保護
一文講清楚線性霍爾靈敏度和輸出關系
線性霍爾靈敏度與輸出范圍的關系解析 一、核心定義與物理基礎 靈敏度(Sensitivity) 線性霍爾傳感器的靈敏度(單位:mV/mT 或 mV/G)表示單位磁場強度變化時輸出電壓的變化量。例如
工業級防爆型PDA手持終端(化工/石油/礦場等場景)的實操指南
今天講防爆型PDA手持終端,主要會講到:為什么要用防爆PDA、它們到底怎么防爆、要看哪些證書與參數、不同場景的選型與落地注意點、以及采購/驗收/運維清單”都會盡量講清楚
阿里云設備的物模型數據里面始終沒有值是哪里的問題?
如上圖,不知道講清楚沒有。 IG502自定義TOPIC 上發到阿里云沒問題。采用阿里云物模型的格式來上發就不行。請大佬指教!
發表于 08-05 06:43
一文講清楚芯片的分類-多個維度
芯片作為現代電子設備的核心組件,其分類方式多樣,以下從功能、應用領域、制造工藝、集成度、設計架構、用途、數據類型、工作方式、材料及封裝形式十個維度進行詳細闡述: 一、按功能分類 1. 處理器芯片
一個簡單例子講清楚指針的應用
評論