“指針”難點(diǎn)解密
作者:xcbeyond
瘋狂源自夢想,技術(shù)成就輝煌!微信公眾號:《程序猿技術(shù)大咖》號主,專注后端開發(fā)多年,擁有豐富的研發(fā)經(jīng)驗(yàn),樂于技術(shù)輸出、分享,現(xiàn)階段從事微服務(wù)架構(gòu)項目的研發(fā)工作,涉及架構(gòu)設(shè)計、技術(shù)選型、業(yè)務(wù)研發(fā)等工作。對于Java、微服務(wù)、數(shù)據(jù)庫、Docker有深入了解,并有大量的調(diào)優(yōu)經(jīng)驗(yàn)。
一談到C語言,令大家最為頭疼的就是“指針”,為何如此說呢?因?yàn)橹羔樖荂語言中最難以琢磨的對象,稍不注意就會帶來意想不到的錯誤,令你難以很快的加以及時的解決,例如:什么內(nèi)存無法讀取等一系列的麻煩問題!針對“指針”這塊知識點(diǎn),我現(xiàn)歸納出一些比較重要而又易混淆之處,以供參考:
要想揭開“指針”神秘的面紗,必先認(rèn)清它是什么東西?再加以學(xué)習(xí),就可以迎刃而解了。關(guān)于指針的概念等等注意的細(xì)節(jié)問題,可參考文章《深入理解C語言指針的奧秘》,在此不做詳細(xì)說明。
任何類型的指針本身占據(jù)了4個字節(jié)的長度(32位平臺中),通過sizeof()可以驗(yàn)證。
數(shù)組指針、指針數(shù)組:
這兩個詞是很容易混淆的,其中數(shù)組指針是一個指針,其指向的數(shù)據(jù)類型是由一個數(shù)組構(gòu)成,如:char s[10];
Char *p=s;
指針數(shù)組的本質(zhì)仍是一個數(shù)組,數(shù)組中的每個元素保存的是一個指針變量,如:int *p[3];
然而,對于int (*p)[3]卻不是一個指針數(shù)組,它是一個二維數(shù)組指針,表示一個指向二維數(shù)組的指針變量,該二維數(shù)組的列數(shù)為3.如:
/*用指針數(shù)組指向而為二維數(shù)組每一行*/
#include<stdio.h>
void main()
{
int a[3][3]={{1,2,3},{4,5,6},{7,8,9}};
int *p[3]={a[0],a[1],a[2]};
int i;
for(i=0;i<3;i++)
printf(“%d %d %d\n”,*p[i],*(p[i]+1),*(p[i]+2));//用指針實(shí)現(xiàn)輸出二維數(shù)組的每個元素
}
分析: int *p[3]={a[0],a[1],a[2]};定義了一個指針數(shù)組,數(shù)組的每個元素都指向了二維數(shù)組a[3][3]的每一行的首地址,即:通過指針數(shù)組每個元素來訪問二維數(shù)組中的每一個元素的值。
指針數(shù)組:
Char *p[]={“C”,”Basic”,”Foxpro”,”Visual Studio”};
通過指針數(shù)組的每個元素來指向每個字符串,p[0]=”C”,p[1]=”Basic”,……這樣比用二維數(shù)組來存放多個字符串更節(jié)約內(nèi)存空間。
/*用指針數(shù)組處理多個字符串*/
#include<stdio.h>
void main()
{
int i;
char *s[]={ ”C”,”Basic”,”Foxpro”,”Visual Studio”};
for(i=0;i<sizeof(s)/4;i++) //sizeof(s)/4指指針數(shù)組元素的個數(shù)(每個指針占4個字節(jié))
printf(“%s\n”,s[i]);
}
指向指針的指針:
如果一個指針變量存放的又是另一個指針變量的地址,則稱這個指針變量為指向指針的指針變量。如:
int i=10;
int *p=&i;
int **pp=&p;
/*指向指針的指針實(shí)例*/
#include <stdio.h>
int main()
{
int i=10;
int *p=&i;
int **pp=&p;
printf(“二級指針變量pp指向地址:%d\n”,pp);
printf(“變量p的地址:%d\n”,&p);
printf(“一級指針變量p指向地址:%d\n”,p);
printf(“變量i的地址:%d\n”,&i);
printf(“i=%d\n”,i);
printf(“p=%d\n”,p);
printf(“*p=%d\n”,*p);
printf(“pp=%d\n”,pp);
printf(“*pp=%d\n”,*pp);
printf(“**pp=%d\n”,**pp);
}