程序員考試補(bǔ)課筆記-第十天
今天接著上天的二維數(shù)組,我們看看指向二維數(shù)組的指針是怎么的。在講之前我想再重復(fù),如果你自己理解好二維數(shù)組的就按你以往的去理解吧。不過(guò)多想想幾種方法也是一件好事,那么下面就來(lái)講講了。
現(xiàn)在來(lái)看看昨天的那個(gè)二維數(shù)組圖,第九天圖一。我們定義一個(gè)指向二維數(shù)數(shù)的指針
int a[3][4];
int *p;
p=a;
其實(shí)這也指向一維數(shù)組的指針完全沒(méi)有分別,二維數(shù)組因?yàn)槭切袃?yōu)先的,一行下來(lái)就是列順序了,我們可以這樣來(lái)用指針指向列,如下:
p++;
我們這里就是指向了第0行的第1列了,那么我們?cè)趺纯梢缘降谙乱恍心?,其?shí)定義數(shù)組時(shí)內(nèi)存就給數(shù)組分配好一連串的連續(xù)空間,我們直接可以將指針繼續(xù)往下移,當(dāng)移到了0行后一列時(shí),加移的話就到了第1行了。其實(shí)C語(yǔ)言里還有一種更方面的指向方法,看如下:
int (*p)[4] /*這里是定義一個(gè)數(shù)指針,而這個(gè)指針是指向有數(shù)組四個(gè)元素的指針*/
我們看看這種定義的方式,*p為什么一定要括號(hào)括住呢,因?yàn)閇]這個(gè)運(yùn)算符比*優(yōu)先,如果不加括號(hào)的話就變成了定義另一個(gè)指針,至于是什么指針在面就會(huì)講到了,現(xiàn)在先來(lái)看看這種指針。
p=a;
p++; 這樣會(huì)得到什么的結(jié)果呢?就是直接往下移一行了,這也是和前天說(shuō)過(guò)的那個(gè)道理一樣,是按照定義的類型結(jié)合來(lái)到運(yùn)算的。我們知道了如何可以移行,那么該怎么移列呢?這個(gè)問(wèn)題又更復(fù)雜一點(diǎn)了,試著把指針移到第1行第2列看看。我們先來(lái)看看這個(gè)表達(dá)式代表什么吧,a+1 這就是第一行的首地址吧,同理p+1也是指向第一行的首地址。至于列呢?先想想一維數(shù)組是怎么移到列的,就是首地址加上列序吧!那么我們就可以先表達(dá)出一維數(shù)組的首地址先,*(p+1)+2,看,這樣是不是指向了第一行第二列了呢。我們不可以簡(jiǎn)單的理解(p+1)為行,從另一種意義上可以看成是列的首地址了(這里實(shí)在太難理解了,明還是有一點(diǎn)明,不過(guò)我還想用回自己一直對(duì)指針的理解好了,千萬(wàn)不要綜合起來(lái)理解喔,這樣就太錯(cuò)特錯(cuò)了)。
好了說(shuō)回了二維數(shù)組成的現(xiàn)在來(lái)看看還有其它的什么指針,字符指針是比較簡(jiǎn)單的,不過(guò)也有它的一些特別之處。我們來(lái)看看以下的一些程序:
char *p;
p="ABC"; /*這里說(shuō)說(shuō),既然是字符串就是一定有結(jié)束符的,這是和字符數(shù)組不同的*/
這樣的賦值是可以的,這里是將字符串ABC的首地址賦給指針p,下現(xiàn)再看看另一個(gè)程序:
char a[4];
a="ABC";
這里有錯(cuò)嗎?對(duì)于C語(yǔ)言來(lái)說(shuō)是錯(cuò)了的了,因?yàn)樽址麛?shù)組a是一個(gè)常量,不能給賦值。其它的高級(jí)語(yǔ)言就可以直接賦值給它就回事了,那么我們想把ABC賦給字符數(shù)組該怎么呢,這里有幾種方法,一種就是一個(gè)一個(gè)字符賦值,一種就是利用指針,不過(guò)這里還是用回C語(yǔ)言函數(shù)庫(kù)里的復(fù)制字符串函數(shù)完成strcpy();大家應(yīng)該都對(duì)這個(gè)函數(shù)不默生吧,那好,現(xiàn)在就給五分鐘做做練習(xí),編制一個(gè)類于strcpy()的函數(shù)?!瓡r(shí)間真的過(guò)得快,我把我做的寫出來(lái)吧。
mycpy(char *s1,char *s2)
{ for(;*s1++=*s2++;); }
好了,就這么短短二行就完成了復(fù)制功能,這只有C語(yǔ)言才能做到的。
現(xiàn)在再來(lái)看看以下兩個(gè)程序吧
char *p,*q; char *p,*q,*r;
p="ABC"; r="ABC";
q="ABC"; p=r;
*q='D'; q=r;
printf("%s",%s",p,q); *q='D';
printf("%s,%s",p,q);
這里的答案是什么呢?自己先想想吧。
好了,應(yīng)該都想完了吧,現(xiàn)在就給出正確的答案,第一條程序是輸出ABC,DBC,而第二條程序就是輸出DBC,DBC。這里為什么呢?其實(shí)是因?yàn)榈谝粋€(gè)程序都是指向了同一個(gè)地址,那當(dāng)然就是值一樣啦。
今天接著上天的二維數(shù)組,我們看看指向二維數(shù)組的指針是怎么的。在講之前我想再重復(fù),如果你自己理解好二維數(shù)組的就按你以往的去理解吧。不過(guò)多想想幾種方法也是一件好事,那么下面就來(lái)講講了。
現(xiàn)在來(lái)看看昨天的那個(gè)二維數(shù)組圖,第九天圖一。我們定義一個(gè)指向二維數(shù)數(shù)的指針
int a[3][4];
int *p;
p=a;
其實(shí)這也指向一維數(shù)組的指針完全沒(méi)有分別,二維數(shù)組因?yàn)槭切袃?yōu)先的,一行下來(lái)就是列順序了,我們可以這樣來(lái)用指針指向列,如下:
p++;
我們這里就是指向了第0行的第1列了,那么我們?cè)趺纯梢缘降谙乱恍心?,其?shí)定義數(shù)組時(shí)內(nèi)存就給數(shù)組分配好一連串的連續(xù)空間,我們直接可以將指針繼續(xù)往下移,當(dāng)移到了0行后一列時(shí),加移的話就到了第1行了。其實(shí)C語(yǔ)言里還有一種更方面的指向方法,看如下:
int (*p)[4] /*這里是定義一個(gè)數(shù)指針,而這個(gè)指針是指向有數(shù)組四個(gè)元素的指針*/
我們看看這種定義的方式,*p為什么一定要括號(hào)括住呢,因?yàn)閇]這個(gè)運(yùn)算符比*優(yōu)先,如果不加括號(hào)的話就變成了定義另一個(gè)指針,至于是什么指針在面就會(huì)講到了,現(xiàn)在先來(lái)看看這種指針。
p=a;
p++; 這樣會(huì)得到什么的結(jié)果呢?就是直接往下移一行了,這也是和前天說(shuō)過(guò)的那個(gè)道理一樣,是按照定義的類型結(jié)合來(lái)到運(yùn)算的。我們知道了如何可以移行,那么該怎么移列呢?這個(gè)問(wèn)題又更復(fù)雜一點(diǎn)了,試著把指針移到第1行第2列看看。我們先來(lái)看看這個(gè)表達(dá)式代表什么吧,a+1 這就是第一行的首地址吧,同理p+1也是指向第一行的首地址。至于列呢?先想想一維數(shù)組是怎么移到列的,就是首地址加上列序吧!那么我們就可以先表達(dá)出一維數(shù)組的首地址先,*(p+1)+2,看,這樣是不是指向了第一行第二列了呢。我們不可以簡(jiǎn)單的理解(p+1)為行,從另一種意義上可以看成是列的首地址了(這里實(shí)在太難理解了,明還是有一點(diǎn)明,不過(guò)我還想用回自己一直對(duì)指針的理解好了,千萬(wàn)不要綜合起來(lái)理解喔,這樣就太錯(cuò)特錯(cuò)了)。
好了說(shuō)回了二維數(shù)組成的現(xiàn)在來(lái)看看還有其它的什么指針,字符指針是比較簡(jiǎn)單的,不過(guò)也有它的一些特別之處。我們來(lái)看看以下的一些程序:
char *p;
p="ABC"; /*這里說(shuō)說(shuō),既然是字符串就是一定有結(jié)束符的,這是和字符數(shù)組不同的*/
這樣的賦值是可以的,這里是將字符串ABC的首地址賦給指針p,下現(xiàn)再看看另一個(gè)程序:
char a[4];
a="ABC";
這里有錯(cuò)嗎?對(duì)于C語(yǔ)言來(lái)說(shuō)是錯(cuò)了的了,因?yàn)樽址麛?shù)組a是一個(gè)常量,不能給賦值。其它的高級(jí)語(yǔ)言就可以直接賦值給它就回事了,那么我們想把ABC賦給字符數(shù)組該怎么呢,這里有幾種方法,一種就是一個(gè)一個(gè)字符賦值,一種就是利用指針,不過(guò)這里還是用回C語(yǔ)言函數(shù)庫(kù)里的復(fù)制字符串函數(shù)完成strcpy();大家應(yīng)該都對(duì)這個(gè)函數(shù)不默生吧,那好,現(xiàn)在就給五分鐘做做練習(xí),編制一個(gè)類于strcpy()的函數(shù)?!瓡r(shí)間真的過(guò)得快,我把我做的寫出來(lái)吧。
mycpy(char *s1,char *s2)
{ for(;*s1++=*s2++;); }
好了,就這么短短二行就完成了復(fù)制功能,這只有C語(yǔ)言才能做到的。
現(xiàn)在再來(lái)看看以下兩個(gè)程序吧
char *p,*q; char *p,*q,*r;
p="ABC"; r="ABC";
q="ABC"; p=r;
*q='D'; q=r;
printf("%s",%s",p,q); *q='D';
printf("%s,%s",p,q);
這里的答案是什么呢?自己先想想吧。
好了,應(yīng)該都想完了吧,現(xiàn)在就給出正確的答案,第一條程序是輸出ABC,DBC,而第二條程序就是輸出DBC,DBC。這里為什么呢?其實(shí)是因?yàn)榈谝粋€(gè)程序都是指向了同一個(gè)地址,那當(dāng)然就是值一樣啦。

