很多人遇到指針就糊涂,搞不清到底指向什么,其實是你沒搞清楚 * 修飾誰,還有一些關鍵字修飾誰。
看下面的例子,定義一個無符號字符變量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瀏覽量
70988 -
CONST
+關注
關注
0文章
45瀏覽量
8385
原文標題:指針的應用,一個簡單例子講清楚你多年的糊涂
文章出處:【微信號:gh_c472c2199c88,微信公眾號:嵌入式微處理器】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
熱點推薦
一文講清楚芯片的分類-多個維度
芯片作為現代電子設備的核心組件,其分類方式多樣,以下從功能、應用領域、制造工藝、集成度、設計架構、用途、數據類型、工作方式、材料及封裝形式十個維度進行詳細闡述: 一、按功能分類 1. 處理器芯片
函數指針的六個常見應用場景
函數指針在嵌入式開發中有著廣泛的應用,它讓代碼更加靈活,減少冗余,提高可擴展性。很多時候,我們需要根據不同的情況動態調用不同的函數,而函數指針正是實現這一需求的重要工具。本文將介紹六個

Intel為什么在2015年收購Altera?現在又為什么拋棄Altera
在寫這篇文章時,我想了很多標題,但總感覺沒有哪個能把文章的意思全都總結清楚的,所以我又起了副標題:斷臂求生的Intel。 要講清楚Intel為什么要收購Altera,現在又為什么拋棄,需要從很多

一文講清楚電動汽車充電系統
充電系統是新能源汽車主要的能源供給系統,為保障車輛持續行駛提供動力能源。電動汽車的充電系統是新能源轉型的關鍵組成部分,直接影響著車輛的使用體驗與效率。根據電動汽車動力蓄電池的技術特性和使用性質,其充電模式主要分為常規充電、快速充電和快速換電三種。常規充電(慢充):使用交流電,由外部電網提供220V民用單相交流電給電動汽車車載充電機,再由車載充電機給動力電池充

桃芯科技軟件審核簡介
本文檔對如何審核一個項目的軟件是否符合量產要求進行闡述;審核目的為確保軟件足夠健全、穩定、易于量產,做出更有品質的產品;該文檔不一定會講清楚每個檢測項,但會盡可能提示你如何掌控調整方向。

指針數組和二維數組有沒有區別
] = { "hello", "world", "total" }; return 0;} 從后面的初始化方式可以看出,他們好像一樣,里面都保存了三個字符串。 想要搞清楚他們的區別,還得看下他們在內存中的排布
C語言指針運算符詳解
在C語言中,當你有一個指向數組中某個元素的指針時,你可以對該指針執行某些算術運算,例如加法或減法。這些運算可以用來遍歷數組中的元素,如ptr[i]等價于*(ptr + i)。然而,如果
電容的“通交流、阻直流”,終于有人講清楚了!
“通交阻直”是電容重要的特性之一,即電容可以交流電導通,但直流電阻斷。
這是為什么呢?
從理論上來講,電荷是根本不能在電容中流動的。 因為在平行板電容上電后,一塊板帶正電,另一塊板帶負電,在兩快板
發表于 10-09 11:43
電流計指針偏轉方向是正極還是負極
電流計指針的偏轉方向并非簡單地指向正極或負極,而是取決于電流的流入方向以及電流計正負極的連接方式。以下是對這一問題的分析: 一、電流流入方向與指針
阿里云設備的物模型數據里面始終沒有值是為什么?
如上圖,不知道講清楚沒有。 IG502自定義TOPIC 上發到阿里云沒問題。采用阿里云物模型的格式來上發就不行。請大佬指教!
發表于 07-24 07:49
評論