趙俊峰
(太原大學(xué)外語(yǔ)師范學(xué)院,山西 太原 030012)
指針是C語(yǔ)言中的一個(gè)非常重要的概念,也是C語(yǔ)言的精華之所在.只有掌握了指針,才能說(shuō)掌握了C語(yǔ)言.靈活而正確地運(yùn)用好指針,可以非常方便地表示復(fù)雜的數(shù)據(jù)類型,提高C語(yǔ)言的編程效率.指針即是地址,一個(gè)數(shù)據(jù)對(duì)象的指針即是這種數(shù)據(jù)對(duì)象的地址.要真正掌握指針,必須理解指針與變量、指針與數(shù)組、指針與字符串、指針與函數(shù)、指針與結(jié)構(gòu)體之間的關(guān)系.
變量的指針即是變量的地址,若有定義:int a;則變量a的地址可以用&a獲得(&為取地址運(yùn)算符).
指針變量即在其中存放地址的變量.指針變量與普通變量不同,普通變量中存放的是值(可以是整數(shù)、實(shí)數(shù)或字符等),而指針變量中存放的是另一個(gè)數(shù)據(jù)對(duì)象的地址,即這個(gè)指針變量就直接指向了另一個(gè)數(shù)據(jù)對(duì)象.要使用指針變量必須經(jīng)過(guò)定義、關(guān)聯(lián)和引用三個(gè)階段.
(1)定義:int a,*p;&&a為普通變量,p為指針變量.
(2)關(guān)聯(lián):p=&a;&&由于在p中存放了a的地址,指針變量p則指向a.
(3)引用:printf(“%d”,*p);&& 通過(guò)*p間接引用 p所指向的變量a.
上述的指針變量p直接指向普通變量,這種變量即為一級(jí)指針.若某個(gè)指針變量間接指向普通變量,這種指針變量則為二級(jí)指針[1].如有定義:int a,*p,**q;則 p 為一級(jí)指針,q為二級(jí)指針.若有關(guān)聯(lián):p=&a;q=&p;則q通過(guò)p間接地指向了變量a.這時(shí),引用a的方法就有了a、*p、**q這三種形式.
一維數(shù)組的指針即是一維數(shù)組的首地址,若有定義:int a[10];則數(shù)組名a代表的即是數(shù)組的首地址.
若在一個(gè)指針變量中存放了某個(gè)一維數(shù)組的首地址,則這個(gè)指針變量就指向了這個(gè)數(shù)組中的第1個(gè)元素[2].要使用這種指針變量也必須經(jīng)過(guò)定義、關(guān)聯(lián)和引用三個(gè)階段.
(1)定義:int a[10],*p;&& a為一維數(shù)組,p為指針變量.
(2)關(guān)聯(lián):p=a;或p=&a[0];&& 在p中存放了數(shù)組a的首地址,p則指向數(shù)組a的第1個(gè)元素.
(3)引用:*p、p++、*p++等等 && 通過(guò)p++可以讓p指向下一個(gè)元素.
指向一維數(shù)組的指針變量不僅可以指向第一個(gè)元素,還可以在指向數(shù)組中的其他元素.如有定義:int a[10],*p=a+5;則p指針指向數(shù)組中下標(biāo)為5的a[5]元素.
二維數(shù)組可以看作是特殊的一維數(shù)組.若有定義:int a[3][4];可以把第 1 行的元素 a[0][0]、a[0][1]、a[0][2]、a[0][3]看作是數(shù)組名為 a[0]的一維數(shù)組,依次類推,第2行可以看作是數(shù)組名為a[1]的一維數(shù)組,第3行可以看作是數(shù)組名為 a[2]的一維數(shù)組.而 a[0]、a[1]、a[2]又可以看作是數(shù)組名為a的一維數(shù)組,因此二維數(shù)組即是一維數(shù)組的一維數(shù)組.如下圖所示,不難看出二維數(shù)組名其實(shí)是二級(jí)指針,間接地指向二維數(shù)組a的元素[3].
若在一個(gè)指針變量中存放了某個(gè)二維數(shù)組的第1個(gè)元素的地址,則這個(gè)指針變量就指向了這個(gè)數(shù)組中的第1個(gè)元素.要使用這種指針變量也必須經(jīng)過(guò)定義、關(guān)聯(lián)和引用三個(gè)階段.
(1)定義:int a[3][4],*p;&& a為二維數(shù)組,p為指針變量.
(2)關(guān)聯(lián):p=&a[0][0];或 p=a[0];&& 因?yàn)?a[0]可以看作是第1行數(shù)組的數(shù)組名,因此a[0]和&a[0][0]是等價(jià)的.
(3)引用:*p、p++、*p++等等 && 通過(guò)p++可以讓p指向下一個(gè)元素.
上述指針p直接指向二維數(shù)組的某一個(gè)元素,因此指針p為一級(jí)指針.p++的作用是讓p指針指向下一個(gè)元素,而不是指向下一行元素.不難發(fā)現(xiàn)取地址運(yùn)算符&和下標(biāo)運(yùn)算符[]是可逆的,可以相互抵消.
在上圖中,我們可以發(fā)現(xiàn)二維數(shù)組名a指向的并不是某一個(gè)元素,它指向的是某行元素,即它指向了一行的一維數(shù)組.要使用這種指針變量也必須經(jīng)過(guò)定義、關(guān)聯(lián)和引用三個(gè)階段.
(1)定義:int a[3][4],(*p)[4];&& a為二維數(shù)組,p為指向一維數(shù)組的指針變量.
(2)關(guān)聯(lián):p=&a[0];或p=a;&& 因?yàn)閿?shù)組元素a[0]、a[1]、a[2]的數(shù)組名為 a,因此 a和 &a[0]是等價(jià)的.
(3)引用:p[i][j]、*(*(p+i)+j)&& 下標(biāo)運(yùn)算符[]和指針運(yùn)算符*是等價(jià)的.
上述指針p直接指向二維數(shù)組的某一行,間接指向二維數(shù)組的某個(gè)元素,因此指針p為二級(jí)指針.p++的作用不是讓p指針指向下一個(gè)元素,而是指向下一行元素[4].
數(shù)組指針即指向數(shù)組的指針,而指針數(shù)組則是元素為地址的數(shù)組.指針數(shù)組的定義如下:int*p[3];則p為長(zhǎng)度為3的一維數(shù)組,其每個(gè)元素中都存放著地址.不難發(fā)現(xiàn):無(wú)論是指向數(shù)組的指針變量,還是存放指針的數(shù)組名,都是二級(jí)指針.
字符串的指針是字符串的首地址,即字符串中第一個(gè)字符的地址.串常量代表的即是串的首地址.如串常量“abcdefg”代表的是串中第1個(gè)字符‘a(chǎn)’的地址.
若在一個(gè)指針變量中存放了某個(gè)字符串的首地址,則這個(gè)指針變量就指向了這個(gè)串中的第1個(gè)元素.若有定義:int*p=“abcdefg”;則指針p指向了字符a.可以通過(guò)p++或p--可以讓p指向串中的下一個(gè)或上一個(gè)字符.
利用指針對(duì)字符串進(jìn)行操作,要比用字符數(shù)組更簡(jiǎn)單和方便.因?yàn)閿?shù)組名是地址常量,不能通過(guò)++或--指向其他字符.而指針p是地址變量,引用起來(lái)更靈活.如:語(yǔ)句while(*p++=*q++);的作用是將q所指字符串拷貝到p中.語(yǔ)句組while(*p++==*q++);return*p-*q;的作用是比較字符串是否相等.語(yǔ)句組while(*p)p++;while(*p++==*q++);的作用是將q所指字符串連接到p所指字符串之后.語(yǔ)句while(*p){if(*p>=’a’&& *p< =’z’)*p=*p-32;p++;}的作用是將p所指字符串中所有的小寫(xiě)字母改為大寫(xiě)字母.語(yǔ)句組n=0;while(*p)n++;的作用是求p所指字符串的長(zhǎng)度(不包括‘ 华亭县| 辽源市| 平原县| 周口市| 辽源市| 宜兰市| 深水埗区| 安泽县| 广安市| 肃宁县| 延安市| 龙州县| 井冈山市| 阿尔山市| 铜梁县| 玉龙| 常德市| 竹北市| 施秉县| 宿松县| 黔西县| 宝山区| 芦山县| 谢通门县| 永定县| 商水县| 阜阳市| 怀来县| 宁都县| 湖口县| 武城县| 玉溪市| 吉木萨尔县| 江永县| 黑山县| 柏乡县| 和政县| 中宁县| 盐源县| 平南县| 富民县|