C語(yǔ)言程序設(shè)計(jì)教程(第二版)c第7章_第1頁(yè)
C語(yǔ)言程序設(shè)計(jì)教程(第二版)c第7章_第2頁(yè)
C語(yǔ)言程序設(shè)計(jì)教程(第二版)c第7章_第3頁(yè)
C語(yǔ)言程序設(shè)計(jì)教程(第二版)c第7章_第4頁(yè)
C語(yǔ)言程序設(shè)計(jì)教程(第二版)c第7章_第5頁(yè)
已閱讀5頁(yè),還剩45頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

《C語(yǔ)言程序設(shè)計(jì)教程》

(第二版)Lizq98@李志球、劉昊編著1第7章

指針

本章要點(diǎn):

了解指針和指針變量的基本概念◆

掌握指針變量的定義和引用方法◆

掌握數(shù)組的指針和指向數(shù)組的指針變量◆

掌握函數(shù)的指針和指向函數(shù)的指針變量◆

掌握指針數(shù)組和指向指針的指針概念2第7章

指針目錄

7.1指針的概念7.2指針變量7.3指針與數(shù)組7.4指針與函數(shù)7.5返回指針值的函數(shù)7.6指針數(shù)組和指向指針的指針

37.1指針的概念在計(jì)算機(jī)中,所有的數(shù)據(jù)都是存放在存儲(chǔ)器中的。不同的數(shù)據(jù)類型所占用的內(nèi)存單元數(shù)不等,為了正確地訪問(wèn)這些內(nèi)存單元,必須為每個(gè)內(nèi)存單元編號(hào)。根據(jù)一個(gè)內(nèi)存單元的編號(hào)即可準(zhǔn)確地找到該內(nèi)存單元,內(nèi)存單元的編號(hào)稱為地址。說(shuō)明一個(gè)變量后,編譯器將劃分出若干存儲(chǔ)器單元來(lái)存儲(chǔ)該變量。編譯器將這個(gè)存儲(chǔ)單元地址與變量名聯(lián)系起來(lái),程序引用這個(gè)變量名時(shí),系統(tǒng)就訪問(wèn)相應(yīng)的存儲(chǔ)單元。1000100110021003100410051006100710081009

100value47.1指針的概念內(nèi)存單元的編號(hào)或地址稱為指針。C語(yǔ)言中允許用一個(gè)變量來(lái)存放指針,這種變量稱為指針變量。因此,一個(gè)指針變量的值就是某個(gè)內(nèi)存單元的地址或稱為某內(nèi)存單元的指針。例如定義p_value用來(lái)存放value的地址,如上圖所示。因?yàn)閜_value包含變量value的地址,所以它指向value在存儲(chǔ)器中的存儲(chǔ)單元,也就是說(shuō),p_value是指向value的,一般把它稱作value的一個(gè)指針,如下圖所示。1000100110021003100410051006100710081009

1001002valuep_value57.2指針變量7.2.1指針變量的定義及賦值1.指針變量的定義

定義指針變量的格式類型說(shuō)明符*變量名;其中,類型名說(shuō)明指針變量所指向變量的類型;星號(hào)(*)說(shuō)明所定義的變量是一個(gè)指針變量。指針變量可與非指針變量一起說(shuō)明,例如:char*p_char;float*p_value,percent;注意:*p_char說(shuō)明了p_char是一個(gè)指針變量,指針變量名為p_char,而不是*p_char。67.2指針變量7.2.1指針變量的定義及賦值2.指針變量的賦值

1)指針變量初始化2)用賦值語(yǔ)句給指針變量賦值指針變量的賦值只能賦予地址,而不能賦予任何其它數(shù)據(jù),否則將引起錯(cuò)誤。未經(jīng)賦值的指針變量不能使用,否則將造成系統(tǒng)混亂,甚至死機(jī)。在定義指針變量同時(shí),可以把另一變量的地址賦值給指針變量,即指針變量的初始化。例如:

inta;int*p=&a;inta,*p;p=&a;77.2指針變量7.2.1指針變量的定義及賦值3)說(shuō)明:(1)上例賦值語(yǔ)句中右邊的符號(hào)“&”為取地址運(yùn)算符,當(dāng)取地址運(yùn)算符“&”放在一個(gè)變量名之前時(shí),它返回該變量在內(nèi)存中的首地址。(2)不允許把一個(gè)數(shù)賦予指針變量,故下面的賦值是錯(cuò)誤的:

p_value=1002;應(yīng)該使用取地址運(yùn)算符“&”把一個(gè)地址賦給指針變量。如:

p_value=&value;2.指針變量的賦值

87.2指針變量7.2.1指針變量的定義及賦值3)說(shuō)明:(3)使用未初始化的指針變量雖不會(huì)引起編譯出錯(cuò),但可能導(dǎo)致無(wú)法預(yù)料的后果。指針變量在保存一個(gè)變量的地址之前是不起作用的。(4)一個(gè)指針變量只能指向同一個(gè)類型的變量,必須在定義時(shí)規(guī)定指針變量所指向變量的類型。(5)指針變量只能存放地址,不能將一個(gè)整型量賦給一個(gè)指針變量。2.指針變量的賦值

97.2指針變量7.2.2指針變量的引用

1000100110021003100410051006100710081009

1001002valuep_value*p_value在說(shuō)明并初始化指針變量之后,便可在程序中引用該指針變量了,指向運(yùn)算符(*)也因此顯示出它的重要性,將它放在指針變量名之前時(shí),表示引用指針變量所指向的變量。如圖7.2所示。圖7.2指向運(yùn)算符用于指針將指針變量p_value指向變量value,則可以用*p_value來(lái)引用變量value。即*p_value與value具有同樣的意義,如果想打印value的值,可以寫(xiě)成:

printf("%d",value);或printf("%d",*p_value);107.2指針變量7.2.2指針變量的引用【例7.1】

指針基本使用方法。#include<stdio.h>main(){int

var=100;

int*ptr;

ptr=&var;/*直接和間接訪問(wèn)變量var*/

printf("\nDirect

access,var=%d",var);

printf("\nIndirect

access,var=%d",*ptr);/*用兩種方法顯示變量var的地址*/

printf("\n\nTheaddressofvar=%ld",(long)&var);

printf("\nTheaddressofvar=%ld",(long)ptr);}程序運(yùn)行結(jié)果:Directaccess,var=100Indirectaccess,var=100Theaddressofvar=1569325022Theaddressofvar=1569325022117.2指針變量7.2.3指針變量作函數(shù)參數(shù)在第6章中,函數(shù)參數(shù)是普通變量,函數(shù)和被調(diào)用函數(shù)之間是以值傳遞的方式進(jìn)行參數(shù)的信息傳遞的。引入指針概念后,可以用指針作為函數(shù)的參數(shù),使在被調(diào)用函數(shù)種可以改變主調(diào)函數(shù)中變量的值。一般在主調(diào)函數(shù)中將變量的地址(指針)作為參數(shù)傳遞給函數(shù),被調(diào)用函數(shù)執(zhí)行時(shí),按這個(gè)地址去存取變量參數(shù)的值。127.2指針變量7.2.3指針變量作函數(shù)參數(shù)【例7.2】

對(duì)輸入的兩個(gè)整數(shù)按大小順序輸出。swap(int*p1,int*p2){int

val;

val=*p1;*p1=*p2;*p2=val;}main(){int

a,b;

int*pointer1,*pointer2;

scanf("%d,%d",&a,&b);pointer1=&a;pointer2=&b;

if(a<b)swap(pointer1,pointer2);

printf("\n%d,%d\n",a,b);}程序運(yùn)行結(jié)果為:3,7<CR>7,3137.3指針與數(shù)組

指針與數(shù)組之間存在特殊的關(guān)系。實(shí)際上,在使用數(shù)組下標(biāo)時(shí),就是在不明白指針情況下使用了指針。指針變量可以象指向簡(jiǎn)單變量一樣指向數(shù)組和數(shù)組元素,即把數(shù)組元素的起始地址或某一元素的地址放到一個(gè)指針變量中。數(shù)組元素的指針指向該元素的地址,數(shù)組的指針則是指向數(shù)組首元素的地址,即數(shù)組的起始地址。147.3指針與數(shù)組

7.3.1指向數(shù)組元素的指針變量一個(gè)數(shù)組是由連續(xù)的一塊內(nèi)存單元組成的。數(shù)組名就是這塊連續(xù)內(nèi)存單元的首地址。數(shù)組的元素按順序存儲(chǔ)在存儲(chǔ)器單元中,它的第一個(gè)元素位于第一位,其后的數(shù)組元素(下標(biāo)大于0)存儲(chǔ)在后續(xù)地址。每個(gè)數(shù)組元素按其類型不同占有幾個(gè)連續(xù)的內(nèi)存單元。指向數(shù)組的指針變量稱為數(shù)組指針變量??梢远x一個(gè)指針變量,并初始化為指向數(shù)組。157.3指針與數(shù)組

7.3.1指向數(shù)組元素的指針變量例如,用array[]第一個(gè)元素的地址來(lái)初始化指針變量p_array:

intaray[100],*p_array;

p_array=array;則表達(dá)式*array是數(shù)組的第一個(gè)元素,*(array+1)是數(shù)組的第二個(gè)元素,依次類推。167.3指針與數(shù)組

7.3.1指向數(shù)組元素的指針變量【例7.4】

輸入10個(gè)整數(shù)存放在數(shù)組中,利用指針變量訪問(wèn)此數(shù)組元素,求出其中的最大值。#include<stdio.h>main(){intx[10],*p,i,n,max,min;p=x;

printf("請(qǐng)輸入10個(gè)整數(shù):");

for(i=0;i<10;i++)

scanf("%d",p+i);max=*p;min=*p;177.3指針與數(shù)組

7.3.1指向數(shù)組元素的指針變量【例7.4】

輸入10個(gè)整數(shù)存放在數(shù)組中,利用指針變量訪問(wèn)此數(shù)組元素,求出其中的最大值。for(i=1;i<10;i++){if(*(p+i)>max)max=*(p+i);if(*(p+i)<min)min=*(p+i);}

printf("\nmax=%d:min=%d\n",max,min);}程序運(yùn)行結(jié)果:請(qǐng)輸入10個(gè)整數(shù):21457870468921556699<CR>max=99:min=21187.3指針與數(shù)組

7.3.2指針運(yùn)算1.指針加減一個(gè)整數(shù)

指針運(yùn)算一般是指針變量的增值和減值。當(dāng)對(duì)指針變量進(jìn)行增1或減1時(shí),將使指針變量的值使它指向下一個(gè)或上一個(gè)數(shù)組元素,并按數(shù)據(jù)類型將保存在指針變量中的地址增值或減值。例如,ptr_to_int

是指向某int型數(shù)組第一個(gè)數(shù)組元素的指針變量,當(dāng)執(zhí)行ptr_to_int++后,則ptr_to_int的值按int型的大小增值(一般為2字節(jié)),從而使ptr_to_int指向下一個(gè)數(shù)組元素。如果ptr_to_float指向一個(gè)float型數(shù)組,則語(yǔ)句ptr_to_float++按float型的大?。ㄒ话銥?字節(jié))給ptr_to_float增值,使之指向下一個(gè)元素。注意,不能對(duì)數(shù)組名執(zhí)行增值和減值運(yùn)算。當(dāng)用指針變量對(duì)數(shù)組元素操作時(shí),編譯器不跟蹤數(shù)組的頭和尾,如果不注意的話,可能會(huì)因指針變量增值或減值而指向數(shù)組之外的元素,一旦如此,可能會(huì)出現(xiàn)意想不到的結(jié)果,197.3指針與數(shù)組

7.3.2指針運(yùn)算【例7.5】

利用指針運(yùn)算與指針?lè)椒▉?lái)存取數(shù)組元素。#include<stdio.h>#defineMAX10main(){int

i_array[MAX]={0,1,2,3,4,5,6,7,8,9,};

int*i_ptr,count;floatf_array[MAX]={0.0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9};float*f_ptr;

i_ptr=i_array;

f_ptr=f_array;for(count=0;count<MAX;count++)

printf("\n%d\t%f",*i_ptr++,*f_ptr++);}程序運(yùn)行結(jié)果:00.00000010.10000020.20000030.30000040.40000050.50000060.60000070.70000080.80000090.900000207.3指針與數(shù)組

7.3.2指針運(yùn)算2.兩個(gè)指針相減

當(dāng)兩個(gè)指針變量指向同一數(shù)組的不同元素時(shí),兩指針變量相減所得之差是兩個(gè)指針?biāo)笖?shù)組元素之間相差的元素個(gè)數(shù)。實(shí)際上是兩個(gè)指針值(地址)相減之差再除以該數(shù)組元素的長(zhǎng)度(字節(jié)數(shù))。例如pf1和pf2是指向同一浮點(diǎn)數(shù)組的兩個(gè)指針變量,設(shè)pf1的值為2010H,pf2的值為2000H,而浮點(diǎn)數(shù)組每個(gè)元素占4個(gè)字節(jié),所以pf1-pf2的結(jié)果為(2000H-2010H)/4=4,表示pf1和pf2之間相差4個(gè)元素。兩個(gè)指針變量不能進(jìn)行加法運(yùn)算。例如,pf1+pf2毫無(wú)實(shí)際意義。217.3指針與數(shù)組

7.3.2指針運(yùn)算3.兩個(gè)指針關(guān)系運(yùn)算

指向同一數(shù)組的兩指針變量進(jìn)行關(guān)系運(yùn)算可表示它們所指數(shù)組元素之間的關(guān)系。例如:pf1==pf2表示pf1和pf2指向同一數(shù)組元素pf1>pf2表示pf1處于高地址位置pf1<pf2表示pf2處于低地址位置指針變量還可以與0比較。設(shè)p為指針變量,則p==0表明p是空指針,它不指向任何變量;p!=0表示p不是空指針??罩羔樖怯蓪?duì)指針變量賦予0值而得到的。例如:#defineNULL0int*p=NULL;227.3指針與數(shù)組

7.3.3數(shù)組名作函數(shù)參數(shù)C語(yǔ)言中,函數(shù)的參數(shù)可以是數(shù)組,此時(shí)實(shí)參與形參都應(yīng)是數(shù)組名,當(dāng)數(shù)組作為函數(shù)參數(shù)時(shí),傳遞的是數(shù)組的首地址,函數(shù)“知道”了數(shù)組的地址后就可以訪問(wèn)數(shù)組元素?!纠?.6】

將數(shù)組傳送到函數(shù)。main(){intarray[6],count;

int

largest(intx[],int);

for(count=0;count<6;count++){printf("輸入一個(gè)整數(shù):")

scanf("%d",&array[count]);}

printf("\n最大值=%d",larges(array,6));}237.3指針與數(shù)組

7.3.3數(shù)組名作函數(shù)參數(shù)【例7.6】

將數(shù)組傳送到函數(shù)。int

largest(intx[],inty){int

count,biggest=-12000;

for(count=0;count<y;count++){if(x[count]>biggest)biggest=x[count];}returnbiggest;}程序運(yùn)行結(jié)果:輸入一個(gè)整數(shù):1<CR>輸入一個(gè)整數(shù):2<CR>輸入一個(gè)整數(shù):3<CR>輸入一個(gè)整數(shù):10<CR>輸入一個(gè)整數(shù):5<CR>輸入一個(gè)整數(shù):6<CR>最大值=10247.3指針與數(shù)組

7.3.3數(shù)組名作函數(shù)參數(shù)數(shù)組名作函數(shù)參數(shù)注意事項(xiàng):(1)當(dāng)把一個(gè)簡(jiǎn)單變量傳送到函數(shù)時(shí),只是傳送了一個(gè)復(fù)制的變量值,函數(shù)可以使用這個(gè)值,但不能改變這個(gè)原始變量。將一個(gè)數(shù)組傳送到函數(shù)時(shí),函數(shù)接受的并不是復(fù)制的數(shù)組的值而是數(shù)組的地址,函數(shù)處理實(shí)際的數(shù)組元素并能修改保存,而作為參數(shù)傳遞到函數(shù)中的數(shù)組地址不會(huì)被改變。(2)形參數(shù)組和實(shí)參數(shù)組的類型必須一致,否則將引起錯(cuò)誤。(3)形參數(shù)組和實(shí)參數(shù)組的長(zhǎng)度可以不相同,因?yàn)樵谡{(diào)用時(shí),只傳送首地址而不檢查形參數(shù)組的長(zhǎng)度。(4)在函數(shù)形參表中,允許不給出形參數(shù)組的長(zhǎng)度。257.3指針與數(shù)組

7.3.3數(shù)組名作函數(shù)參數(shù)【例7.7】用鍵盤(pán)輸入若干個(gè)整數(shù),在函數(shù)中用冒泡法實(shí)現(xiàn)數(shù)據(jù)的由小到大排序。#include<stdio.h>voidsort(int

arry[],intn);main(){intx[100],i,n;

printf("請(qǐng)輸入數(shù)據(jù):");

scanf("%d",&n);數(shù)組名作為函數(shù)參數(shù)時(shí),只把數(shù)組的首地址傳遞給函數(shù),并沒(méi)有把數(shù)組中元素個(gè)數(shù)傳遞給函數(shù),要處理不同大小的數(shù)組,一般將數(shù)組中元素個(gè)數(shù)也作為參數(shù)傳送給函數(shù)。for(i=0;i<n;i++)

scanf("%d",&x[i]);

sort(x,n);

for(i=0;i<n;i++)

printf("%d\t",x[i]);}267.3指針與數(shù)組

7.3.3數(shù)組名作函數(shù)參數(shù)【例7.7】用鍵盤(pán)輸入若干個(gè)整數(shù),在函數(shù)中用冒泡法實(shí)現(xiàn)數(shù)據(jù)的由小到大排序。voidsort(int*arry,intn){int

i,j,t;

for(i=0;i<n-1;i++)

for(j=0;j<n-1-i;j++)if(*(arry+j+1)<*(arry+j)){t=*(arry+j];*(arry+j]=*(arry+j+1);*(arry+j+1)=t;}}277.4指針與函數(shù)1.指向函數(shù)的指針變量

指向函數(shù)的指針提供了調(diào)用函數(shù)的另一種方法。當(dāng)程序運(yùn)行時(shí),每一個(gè)函數(shù)被裝到某個(gè)地址開(kāi)始的內(nèi)存中,這個(gè)起始地址是函數(shù)的入口地址,稱為函數(shù)的指針??梢园汛说刂焚x值給一個(gè)指針變量,然后通過(guò)該指針變量調(diào)用此函數(shù)。它提供了一種靈活的調(diào)用函數(shù)的方法,能使程序在幾個(gè)函數(shù)中“挑選”,并選擇符合當(dāng)前情況的一個(gè)。指向函數(shù)的指針一般說(shuō)明格式如下:

type(*ptr_to_func)(parameter_list);其中,ptr_to_func為一個(gè)指向函數(shù)的指針變量,該函數(shù)返回值為type類型,parameter_list是函數(shù)傳遞的實(shí)參列表。287.4指針與函數(shù)2.用函數(shù)指針實(shí)現(xiàn)函數(shù)的調(diào)用

說(shuō)明了一個(gè)指向函數(shù)的指針變量后,可以將該指針變量指向某個(gè)函數(shù)?!纠?.8】

使用指向函數(shù)的指針調(diào)用函數(shù)。#include<stdio.h>voidmain(){floatsquare(float);float(*p)(float);p=square;

printf("%f%f",square(6.9),p(6.9));}floatsquare(floatx){returnx*x;}程序運(yùn)行結(jié)果:47.61000147.610001297.4指針與函數(shù)2.用函數(shù)指針實(shí)現(xiàn)函數(shù)的調(diào)用

使用指向函數(shù)的指針變量應(yīng)注意:(1)當(dāng)說(shuō)明指向函數(shù)的指針時(shí)不要忘記使用圓括號(hào)。(2)使用格式char(*func)();,說(shuō)明一個(gè)指向不帶參數(shù)且返回字符值的函數(shù)的指針。(3)指針使用前必須初始化。(4)不能使用與所需類型不同的返回值或?qū)崊⒌暮瘮?shù)指針。307.4指針與函數(shù)2.用函數(shù)指針實(shí)現(xiàn)函數(shù)的調(diào)用

【例7.9】使用指向函數(shù)的指針調(diào)用不同的函數(shù)。#include<stdio.h>voidfunc1(int);voidone(void);voidtwo(void);voidother(void);voidmain(){inta;for(;;){puts(“輸入1-10的數(shù),0退出:");scanf("%d",&a);if(a==0)break;func1(a);}}317.4指針與函數(shù)2.用函數(shù)指針實(shí)現(xiàn)函數(shù)的調(diào)用

【例7.9】使用指向函數(shù)的指針調(diào)用不同的函數(shù)。voidfunc1(intx){void(*ptr)(void);if(x==1)

ptr=one;elseif(x==2)

ptr=two;else

ptr=other;

ptr();}程序運(yùn)行結(jié)果:輸入1-10的數(shù),0退出:2<CR>你輸入的是2.輸入1-10的數(shù),0退出:11<CR>你輸入的是1,2以外的數(shù).輸入1-10的數(shù),0退出:0<CR>voidone(void){puts(“你輸入的是1.");}voidtwo(void){puts("你輸入的是2.");}voidother(void){puts(“你輸入的是1,2以外的數(shù).");}327.4指針與函數(shù)2.用函數(shù)指針實(shí)現(xiàn)函數(shù)的調(diào)用

【例7.10】

改寫(xiě)例題7.9,用指向函數(shù)的指針作為參數(shù)傳遞給函數(shù)實(shí)現(xiàn)調(diào)用不同的函數(shù)。#include<stdio.h>voidfunc1(void(*p)(void));voidone(void);voidtwo(void);voidlther(void);voidmain(){void(*ptr)(void);

inta;for(;;){puts("\輸入1-10的數(shù),0退出:");

scanf("%d",&a);337.4指針與函數(shù)2.用函數(shù)指針實(shí)現(xiàn)函數(shù)的調(diào)用

【例7.10】

改寫(xiě)例題7.9,用指向函數(shù)的指針作為參數(shù)傳遞給函數(shù)實(shí)現(xiàn)調(diào)用不同的函數(shù)。voidfunc1(void(*p)(void)){(*p)()}voidone(void){puts("你輸入的是1.");}voidtwo(void){puts("你輸入的是2.");}voidother(void){puts("你輸入的是1,2以外的數(shù).");}if(a==0)break;elseif(a==1)ptr=one;elseif(a==2)

ptr=two;else

ptr=other;func1(ptr);}}347.5返回指針值的函數(shù)函數(shù)可以返回一個(gè)整數(shù)、字符或?qū)崝?shù),也可以返回指針,即地址。返回指針的函數(shù)的定義格式為:例如:double*funcl(parameter_list);structaddress*func2(parameter_list);type*func(parameter_list);不能混淆返回指針的函數(shù)和指向函數(shù)的指針,例如:double(*func)();/*指向一個(gè)返回值為double型函數(shù)的指針*/double*func();/*返回一個(gè)指向double指針的函數(shù)*/說(shuō)明了返回一個(gè)指向double類型指針的函數(shù)

說(shuō)明了返回一個(gè)指向address結(jié)構(gòu)類型指針的函數(shù)357.5返回指針值的函數(shù)【例7.11】

從函數(shù)返回指針與簡(jiǎn)單值。#include<stdio.h>intlarger1(intx,inty);int*larger2(int*x,int*y);voidmain(){inta,b,bigger1,*bigger2;

printf("Entertwointegervalues:");

scanf("%d%d",&a,&b);bigger1=larger1(a,b);

printf("\nThelargervalueis%d.",bigger1);bigger2=larger2(&a,&b);

printf("\nThelargervalueis%d.",*bigger2);}367.5返回指針值的函數(shù)【例7.11】

從函數(shù)返回指針與簡(jiǎn)單值。intlarger1(intx,inty){if(y>x)returny;elsereturnx;}int*larger2(int*x,int*y){if(*y>*x)returny;elsereturnx;}程序運(yùn)行結(jié)果:Entertwointegervalues:1113333<CR>Thelargervalueis3333.Thelargervalueis3333.377.6指針數(shù)組和指向指針的指針

7.6.1指針數(shù)組數(shù)組的全部元素均為指針類型數(shù)據(jù),稱為指針數(shù)組。指針數(shù)組的定義格式為:例如:int*p[10];類型標(biāo)識(shí)*數(shù)組名[數(shù)組長(zhǎng)度說(shuō)明];指針數(shù)組經(jīng)常在字符串處理中使用。一個(gè)字符串是存儲(chǔ)在內(nèi)存中的字符序列,因此用指向第一個(gè)字符的指針(指向char類型的指針)指示串的開(kāi)始,用一個(gè)空字符標(biāo)記串的結(jié)束。通過(guò)說(shuō)明和初始化指向char類型的指針數(shù)組,就可以訪問(wèn)并處理大量的使用指針數(shù)組的字符串了。例如:charmessage[]="Thisisthemessage.";或char*message="Thisisthemessage.";38程序運(yùn)行結(jié)果:Fourscoreandsevenyearsagoourforefathers7.6指針數(shù)組和指向指針的指針

【例7.12】初始化并使用指向char類型的指針數(shù)組。#include<stdio.h>voidmain(){char*message[8]={"Four","score","and","seven","years","ago","our","forefathers"};

intcount;for(count=0;count<8;count++)

printf("%s",message[count]);}

397.6指針數(shù)組和指向指針的指針

【例7.12】初始化并使用指向char類型的指針數(shù)組。100015562012100015562012???????message[0]message[1]message[2]message[3]message[4]message[5]message[6]message[7]message[8]message[9]one\0two\0three\0

在此例中,message是一個(gè)指向串開(kāi)始的指針。指針數(shù)組與字符串的關(guān)系如圖9.6所示。注意,數(shù)組元素message[3]到message[9]沒(méi)有初始化以指向圖中任何對(duì)象。407.6指針數(shù)組和指向指針的指針

【例713】

給函數(shù)傳遞指針數(shù)組。#include<stdio.h>voidprint_strings(char*p[],intn);voidmain(){char*message[8]={"Four","score","and","seven","years","ago","our","forefathers"};print_strings(message,8);}voidprint_strings(char*p[],intn){intcount;

for(count=0;count<n;count++)

printf("%s",p[count]);}程序運(yùn)行結(jié)果:Fourscoreandsevenyearsagoourforefathers本例說(shuō)明一個(gè)指針數(shù)組,且數(shù)組名是指向它的第一個(gè)元素的指針,當(dāng)數(shù)組傳遞給函數(shù)時(shí),程序傳遞的是一個(gè)指向指針數(shù)組(第一個(gè)數(shù)組元素)的指針(數(shù)組名)。417.6指針數(shù)組和指向指針的指針

7.6.2指向指針的指針在C語(yǔ)言中,可以建立指向指針數(shù)據(jù)的指針,即具有一個(gè)指針地址值的變量。說(shuō)明:定義指向指針的指針變量時(shí)需使用雙重指向運(yùn)算符**,當(dāng)用指向指針的指針訪問(wèn)所指的變量時(shí)也使用這種運(yùn)算符。例如:intx=12;/*x是一個(gè)整形變量*/int*ptr=&x;/*ptr是一個(gè)指向x的指針*/int**ptr_to_ptr=&ptr;/*ptr_to_ptr是一個(gè)指向int類型指針的指針*/427.6指針數(shù)組和指向指針的指針

7.6.3指針數(shù)組作main函數(shù)的形參main函數(shù)是可以帶參數(shù)的。C語(yǔ)言規(guī)定main函數(shù)的參數(shù)只能有兩個(gè),習(xí)慣上這兩個(gè)參數(shù)寫(xiě)為argc和argv,而且argc(第一個(gè)形參)必須是整型,argv(第二個(gè)形參)必須是指向字符串的指針數(shù)組。帶形參的main函數(shù)的函數(shù)頭應(yīng)寫(xiě)為:main(argc,argv)int

argv;char*argv[];或?qū)懗?/p>

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論