Linux C编程---指针数组简析(二维数组、多级指针)
講到指針和數(shù)組,先給大家看一道例題:
題目:填空練習(xí)(指向指針的指針)
1.程序分析:
2.程序源代碼:
main()
{ char *s[]={"man","woman","girl","boy","sister"};
char **q;
int k;
for(k=0;k<5;k++)
{ ;/*這里填寫什么語句*/
printf("%s\n",*q);
}
}
指向指針的指針是什么呢?我們把一個(gè)指向指針變量的指針變量,成為多級(jí)指針變量,char **p;這種。
我們?cè)倏催@道題 char *s[]={"man","woman","girl","boy","sister"};這時(shí)一個(gè)字符串?dāng)?shù)組,為什么存放字符串的數(shù)組要定義成指針數(shù)組呢?我們先來看看指針數(shù)組是什么
指針數(shù)組的實(shí)質(zhì)還是數(shù)組,是存放指針的數(shù)組int *p[]? ,(int *)p[]是數(shù)組指針,指向數(shù)組地址的指針,這兩個(gè)概念好像很繞是吧,很難分辨,在這里,博主將自己記憶的方法告訴大家,int *p[]? 大家可以根據(jù)運(yùn)算符優(yōu)先級(jí)來記憶,[]的優(yōu)先級(jí) > *的優(yōu)先級(jí),所以這首先是個(gè)數(shù)組,然后才是指針,所以是指針數(shù)組;(int *)p[],()和[]優(yōu)先級(jí)相等,但()是左結(jié)合,所以(int *)p[]先是指針,后是數(shù)組,所以這是個(gè)數(shù)組指針。
回到這一題,看這一句printf("%s\n",*q);我們知道%s后面跟的應(yīng)該是一個(gè)地址,而*p是p中所指的數(shù)據(jù),所以p地址中保存的還是一個(gè)地址,這就是多級(jí)指針,而我們用char **q;我們只知道q所指向的首地址,后面的數(shù)據(jù)如何分配,我們不得而知,所以這道題應(yīng)該怎么做呢?
大家看看我們添加的內(nèi)容:
[cpp]?view plaincopy大家看輸出結(jié)果:
[cpp]?view plaincopy?
為什么我們給的是p = &s[k]而不是*p = &s[k]呢?這里我們應(yīng)該先理解二維數(shù)組
提到二維數(shù)組,我們又不得不提一維數(shù)組,一維數(shù)組 int a[n] 這里int是我們數(shù)據(jù)元素的數(shù)據(jù)類型,a是什么,a是數(shù)組名,代表數(shù)組的首地址,是數(shù)組第一個(gè)元素的地址,也就是可以說,a是int???a[n]的地址,a[0]也是;這里記住a是地址常量,是常量!常量!常量!重要的事說三遍!常量的特性是什么,不能對(duì)其賦值,大家記住這一點(diǎn)!"[]"是變址運(yùn)算符,所以*(a+i)和a[i]無條件等價(jià)!n是數(shù)據(jù)的偏移量,是數(shù)據(jù)的偏移量,而不是字節(jié)的偏移量!這點(diǎn)和指針的*p++一樣,是數(shù)據(jù)的偏移量,因?yàn)槲覀償?shù)組里放的是整型數(shù)據(jù),也可能是字符型數(shù)據(jù),所占字節(jié)大小是不一樣的,所以是數(shù)據(jù)的偏移量!
我們回到二維數(shù)組??以int [3][4]為例,如下圖
我們知道a[3]中a是地址,a[3][4]呢?a這里也是地址,存放的是什么數(shù)據(jù)呢?看圖就知道,存放的是a[0]? a[1]? a[3],而a[0] a[1] a[2]是什么呢?其實(shí)是地址,地址里指向的分別是a[0][0]? a[1][0]?? a[2][0]的數(shù)據(jù),那我們是不是也可以將二維數(shù)據(jù)當(dāng)成一個(gè)二級(jí)指針來看呢?大家思考一下。
博主思考了一下,說a里面存放的是a[0] ?a[1] a[2]的地址不太確切 ,但a[0] ?a[1] a[2]在這里確實(shí)是地址 ,上面說到二維數(shù)組是否可以看成二級(jí)指針,當(dāng)然不能這樣看,大家應(yīng)該知道,a確實(shí)是代表地址,但它與指針有什么區(qū)別呢?大家看a[1] 的地址如何表示呢?是a+1,指針怎么表示呢?是p+1,好像是一樣哦,但大家應(yīng)該明白這里?a 是常量 ?,p是變量,a + 1 中 a 的值沒有發(fā)生變化,數(shù)組里面所有數(shù)據(jù)的地址都是由唯一的常量 a 來確定的! 而p + 1, p 的值已經(jīng)發(fā)生了變化,因?yàn)?p 是變量!!!!!
?我們?cè)倏纯碿har *s[]={"man","woman","girl","boy","sister"},為什么要加*呢?因?yàn)榇娣诺氖亲址 W址玫刂穪肀硎镜陌?#xff01;所以二級(jí)指針? 二維數(shù)組? 指針數(shù)組 這幾個(gè)概念有時(shí)很容易把人搞暈,大家一定要注意分辨!
今天先寫到這,后面會(huì)指針數(shù)組的深入內(nèi)容!
總結(jié)
以上是生活随笔為你收集整理的Linux C编程---指针数组简析(二维数组、多级指针)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 通过iscsi配置在aix上挂载存储设备
- 下一篇: Boost - 序列化 (Seriali