很多人遇到指針就糊涂,搞不清到底指向什么,其實(shí)是你沒搞清楚 * 修飾誰,還有一些關(guān)鍵字修飾誰。
看下面的例子,定義一個(gè)無符號(hào)字符變量x,然后同時(shí)定義一個(gè)可以指向x的指針p,即可以將x的地址放到指針變量p里面,然后又定義了一個(gè)可以存放p地址的指針pp:
很多時(shí)候還會(huì)遇到const關(guān)鍵字,很多人不知道該如何結(jié)合,到底const修飾誰?int main(void)
{
//無符號(hào)字符變量x,指向無符號(hào)字符變量類型的指針p,指向指針類型p的指針pp.
unsigned char x,*p,**pp;
x=12;
p=&x;
pp=&p;
//const是修飾指針指向的對(duì)象屬性,意思是指針kp只能指向一個(gè)const常量,而kp可以被修改指向不同的const常量,但是不能通過kp指針修改指向變量的值。
int const *kp,k=20,kv=32;
kp=&k;
kp=&kv;
//const是修飾指針mp,mp將指向固定的地址,因此在定義的時(shí)候就應(yīng)該指定好該地址,之后無法修改該指針內(nèi)的地址。
int mv=14;
int *const mp=&mv;
//可以讓kp指向mv的地址,但是不能通過kp,修改mv的值;
kp=&mv;
/*
總結(jié): const *p 表示*p是一個(gè)整體,即指針p指向的某個(gè)變量,而const修飾該變量;
* const p表示const p是一個(gè)整體,const 修飾指針p,即指針p存放的地址不能變。
*/
printf("*p=%d ",*p);
printf("**pp=%d ",**pp);
printf(" p=%d ",p);
printf("pp=%d ",pp);
printf("pp=%d ",&pp);
}
這里你可以將定義看成是從右到左的結(jié)合。
int const *kp;
int *const mp;
例如例子中的這兩個(gè),你看好了,從右到左
int const (*kp);
int *(const mp);
第一個(gè)括號(hào)里是表示kp指針指向的某個(gè)變量,該變量是個(gè)const常量,不可變。
第二個(gè)是const直接修飾了指針mp,意思是指針存放的內(nèi)容是不可變的,就是地址不可變。
*與&是一對(duì)逆操作,*的出現(xiàn)用于定義指針,在使用的時(shí)候用于通過指針找到指向的變量。
而&用于取出變量的地址。
在PC測(cè)試上,推薦一個(gè)C語言的IDE,是C語言入門圣經(jīng)C primer plus上推薦的一款:Pelles C IDE
另外需要注意,如果一個(gè)變量定義為指向常量的指針,那么該指針還是可以指向一個(gè)可變的變量,但是無法通過該指針修改該變量。該變量的屬性就是通過它操作指向的變量都當(dāng)做不可修改常量看待。
報(bào)錯(cuò)內(nèi)容如下:
最后奉上,注釋掉不合法的語句后的完整學(xué)習(xí)代碼
int main(void)
{
//無符號(hào)整形變量x,指向無符號(hào)整形變量類型的指針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是修飾指針指向的對(duì)象屬性,意思是指針kp只能指向一個(gè)const常量,而kp可以被修改指向不同的const常量,但是不能通過kp指針修改指向變量的值。
int const *kp,k=20,kv=32;
kp=&k;
printf("通過指針kp訪問固定的數(shù)k,*kp=%d ",*kp);
kp=&kv;
printf("通過指針kp訪問固定的數(shù)kv,*kp=%d ",*kp);
// 通過kp不可以修改指向地址存放變量的固定值。
// *kp=21;
//const是修飾指針mp,mp將指向固定的地址,因此在定義的時(shí)候就應(yīng)該指定好該地址,之后無法修改該指針內(nèi)的地址。
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("將指向固定數(shù)據(jù)的指針kp指向一個(gè)可以修改的變量mx=24,*kp=%d ",*kp);
// 試圖通過指向固定常量的指針kp修改指向的可修改變量mx時(shí)候,失敗了。
// *kp=25;
//因?yàn)閙p指針指向的地址是const類型,所以下面的操作是非法的,會(huì)報(bào)錯(cuò)。
// mp=&24;
/*
總結(jié): const *p 表示*p是一個(gè)整體,即指針p指向的某個(gè)變量,而const修飾該變量;
* const p表示const p是一個(gè)整體,const 修飾指針p,即指針p存放的地址不能變。
*/
}
責(zé)任編輯:xj
原文標(biāo)題:指針的應(yīng)用,一個(gè)簡(jiǎn)單例子講清楚你多年的糊涂
文章出處:【微信公眾號(hào):嵌入式ARM】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
-
指針
+關(guān)注
關(guān)注
1文章
480瀏覽量
70576 -
CONST
+關(guān)注
關(guān)注
0文章
44瀏覽量
8177
原文標(biāo)題:指針的應(yīng)用,一個(gè)簡(jiǎn)單例子講清楚你多年的糊涂
文章出處:【微信號(hào):gh_c472c2199c88,微信公眾號(hào):嵌入式微處理器】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論