很多人遇到指針就糊涂,搞不清到底指向什么,其實是你沒搞清楚 * 修飾誰,還有一些關鍵字修飾誰。
看下面的例子,定義一個無符號字符變量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文章
480瀏覽量
70551 -
CONST
+關注
關注
0文章
44瀏覽量
8159
原文標題:指針的應用,一個簡單例子講清楚你多年的糊涂
文章出處:【微信號:gh_c472c2199c88,微信公眾號:嵌入式微處理器】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
指針數組和二維數組有沒有區別
] = { "hello", "world", "total" }; return 0;} 從后面的初始化方式可以看出,他們好像一樣,里面都保存了三個字符串。 想要搞清楚他們的區別,還得看下他們在內存中的排布
C語言指針運算符詳解
在C語言中,當你有一個指向數組中某個元素的指針時,你可以對該指針執行某些算術運算,例如加法或減法。這些運算可以用來遍歷數組中的元素,如ptr[i]等價于*(ptr + i)。然而,如果
電容的“通交流、阻直流”,終于有人講清楚了!
“通交阻直”是電容重要的特性之一,即電容可以交流電導通,但直流電阻斷。
這是為什么呢?
從理論上來講,電荷是根本不能在電容中流動的。 因為在平行板電容上電后,一塊板帶正電,另一塊板帶負電,在兩快板
發表于 10-09 11:43
阿里云設備的物模型數據里面始終沒有值是為什么?
如上圖,不知道講清楚沒有。 IG502自定義TOPIC 上發到阿里云沒問題。采用阿里云物模型的格式來上發就不行。請大佬指教!
發表于 07-24 07:49
M8連接器對使用環境有什么要求,一篇文章講清楚!
M8連接器對使用環境有什么要求?德索精密工業,專業生產M8連接器十八年,歡迎前來采購M8相關產品。任何產品在使用中,或多或少對使用環境都有一定的要求,由于統一物體在不同環境中的技術機能也會發生改變
干貨!收藏!一文講清楚數據治理到底是什么?
數據治理的兩個目標:一個是提質量,一個是控安全。通過業務流程優化,規范數據從產生、處理、使用到銷毀的整個生命周期,使得數據在各階段、各流程環節安全可控,合規使用。 數據治理治的是“數據”嗎? 數據
工業級連接器如何做到高抗沖擊性?選款一定要了解這幾點
連接器知識分享工業級連接器多用在工廠、車載、戶外等復雜場景下,因而面臨沖擊等應力影響的概率極高。工業級連接器如何做到高抗沖擊性,確保高可靠連接呢?這篇文章講清楚。工業級連接器如何做到高抗沖擊性?LP
評論