




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第八章 指針本章要求理解指針的概念;掌握指針變量的定義和使用方法;掌握指針變量作函數(shù)參數(shù)時(shí),數(shù)據(jù)的傳遞方式;掌握使用指針處理一維、二維數(shù)組的方法;掌握使用指針處理字符串的方法。 本章重點(diǎn)指針變量的定義和使用指針變量作函數(shù)參數(shù)使用指針處理一維數(shù)組和字符串本章難點(diǎn)使用指針處理一維、二維數(shù)組8.1 指針與指針變量8.2 指針與函數(shù)8.3 指針與數(shù)組8.4 指針與字符串8.5 指針數(shù)組與命令行參數(shù)8.6 程序舉例第 8 章 指針8.1 指針與指針變量8.1.1 指針的概念1.內(nèi)存與變量地址 內(nèi)存地址:內(nèi)存是計(jì)算機(jī)用于存儲(chǔ)數(shù)據(jù)的存儲(chǔ)器,以一個(gè)字節(jié)作為存儲(chǔ)單元,為了便于訪問,給每個(gè)字節(jié)單元一個(gè)唯一的編號(hào),
2、第一字節(jié)單元編號(hào)為0,以后各單元按順序連續(xù)編號(hào),這些單元編號(hào)稱為內(nèi)存單元的地址 。 變量地址:變量所分配存儲(chǔ)空間的首字節(jié)單元地址(字節(jié)單元編號(hào))。 3 6 7 8 1516 A公司B公司C公司一排平房 叫地址 2. 變量的三要素:名字、類型與值 每個(gè)變量都通過變量名與相應(yīng)的存儲(chǔ)單元相連系,具體分配哪些單元給變量,由編譯系統(tǒng)完成變量名到對(duì)應(yīng)內(nèi)存單元地址的變換。 變量分配存儲(chǔ)空間的大小由類型決定。 變量的值則是指相應(yīng)存儲(chǔ)單元的內(nèi)容。 3.內(nèi)存存取方式 直接存?。喊阎苯影醋兞棵虻刂反嫒∽兞恐档姆绞椒Q為 “直接存取”方式。 間接存?。和ㄟ^定義一種特殊的變量專門存放內(nèi)存或變量的地址,然后根據(jù)該地址值再
3、去訪問相應(yīng)的存儲(chǔ)單元 。將要訪問變量a的地址存放在另一個(gè)變量p中,當(dāng)需要訪問變量a時(shí),先取出變量p的內(nèi)容即變量a的地址,再根據(jù)此地址找到變量a所對(duì)應(yīng)的存儲(chǔ)空間。 這種間接的通過變量p得到變量a的地址,再存取變量a的值的方式即為“間接存取”。能夠存放其它變量地址的變量稱作指針變量 通常稱變量p指向變量a,變量a是變量p所指向的對(duì)象400012345400040024800pap(4800) p(4800) a(4000) 4000123454000間接存取示意圖4、指針的概念 在語言中,用指針來表示一個(gè)變量指向另一個(gè)變量這樣的指向關(guān)系。指針和指針變量 指針:是一個(gè)變量的地址 指針變量:用來存儲(chǔ)變
4、量地址(指針)的變量如:p即是一個(gè)指針變量,它存放的是a的地址4000。8.1.2 指針變量的定義與初始化1. 指針變量的定義 類型標(biāo)識(shí)符 *指針變量名;例:float *p1; (定義p1為指向?qū)嵭妥兞康闹羔樧兞? char *p2; (定義p2為指向字符型變量的指針變量)在指針變量定義中,*是一個(gè)說明符,它表明其后的變量是指針變量,如p是指針變量,而不要認(rèn)為“*p”是指針變量。指針變量定義時(shí)指定的數(shù)據(jù)類型不是指針變量本身(變量存放的值)的數(shù)據(jù)類型,而是指針變量所指向的對(duì)象(或稱目標(biāo))的數(shù)據(jù)類型 指針變量存放的是所指向的某個(gè)變量的地址值,而普通變量保存的是該變量本身的值 指針變量并不固定指向
5、一個(gè)變量,可指向同類型的不同變量2. 指針運(yùn)算符與地址運(yùn)算符 與指針引用有關(guān)的兩個(gè)運(yùn)算符:&與*。 &: 取地址運(yùn)算符 *:指針運(yùn)算符,或稱指向運(yùn)算符、間接訪問運(yùn)算 符。指針指向的對(duì)象的表示形式: * 指針變量此處*是訪問指針?biāo)笇?duì)象的運(yùn)算符,與指針定義時(shí)的*不同。3. 指針變量初始化若有定義: int a,*p;語句僅僅定義了指針變量p,但指針變量并未指向確定的變量(或內(nèi)存單元)。因?yàn)檫@些指針變量還沒有賦給確定的地址值,只有將某一具體變量的地址賦給指針變量之后,指針變量才指向確定的變量(內(nèi)存單元)。指針變量初始化:在定義指針時(shí)同時(shí)給指針一個(gè)初始值如: int a,*p=&a;40003a(4
6、000)p*p4. 指針變量的引用 *指針變量名代表所指變量的值。 指針變量名代表所指變量的地址。有定義: int a,*p=&a;用*p來表示p指向的對(duì)象a,*p與a是等價(jià)的。 *p可以象普通變量一樣使用。 例如: a=12; *p=12; scanf(%d,&*p); scanf(%d,p); printf(“%d%d”,*p,a);注意:*與&具有相同的優(yōu)先級(jí),結(jié)合方向從右到左。這樣,&*p即&(*p),是對(duì)變量*p取地址,它與&a等價(jià);p與&(*p)等價(jià),a與*(&a)等價(jià)。 8.1.3 指針運(yùn)算1. 指針的賦值運(yùn)算(1)將變量地址值賦給指針變量,使指針指向該變量。設(shè)有如下定義: in
7、t a,b,*pa,*pb; float *pf;第一行定義了整型變量a,b及指針變量pa,pb。pa、pb還沒有被賦值,因此pa、pb沒有指向任何變量, 下面語句完成對(duì)pa,pb的賦值: pa=&a; pb=&b;例如:int j,k; int *pointer1,*pointer2; pointer1=&j;pointer2=&k; pointer1jpointer2k(2) 相同類型的指針變量間的賦值 pa與pb都是整型指針變量,它們間可以相互賦值,如:pb=pa; 即 pa,pb都指向變量a,此時(shí)a、*pa、*pb是等價(jià)的。指針指向變化如下圖:注意:只有相同類型的指針變量才能相互賦值,
8、如pf=pa;是不允許的。因?yàn)閜a是整型指針,pf是浮點(diǎn)型指針。&a&bpapba,*pab,*pb&a&apapba,*pa,*pbb()給指針變量賦空值 給指針變量賦空值,說明該指針不指向任何變量。 “空”指針值用NULL表示,NULL是在頭文件stdio.h中預(yù)定義的常量,其值為,在使用時(shí)應(yīng)加上預(yù)定義行,如: #include stdio.h int *pa=NULL; 亦可以用下面的語句給指針賦“空值”: pa=0; 或: pa=0; 這里指針pa并非指向0地址單元,而是具有一個(gè)確定的“空值”,表示pa不指向任何變量。注意:指針雖然可以賦值0,但卻不能把其它的常量地址賦給指針。例如:
9、pa=4000; 是非法的。例 8.1 指針定義與初始化main()int a,b;int *pointer_1,*pointer_2;a=100;b=10;pointer_1=&a; pointer_2=&b; printf (%d,%dn,a,b);printf(%d,%dn,*pointer_1,*pointer_2); 程序運(yùn)行結(jié)果:100,10100,10&a&bbpointer_1pointer_2a*pointer_1*pointer_2例8.2 從鍵盤上輸入兩個(gè)整數(shù)到a、b,按由大到小輸出。#include main( ) int a,b,*pa=&a,*pb=&b,*p;/*
10、定義指針變量pa、pb,如下頁圖a*/ scanf(%d%d,&a,&b); if (*pa*pb) p=pa; /*進(jìn)行指針交換,如下頁圖b,c*/ pa=pb; pb=p; printf(n a=%d,b=%dn,a,b); printf(n max=%d,min=%d,*pa,*pb); /* pa指向大數(shù),pb指向小數(shù)*/若輸入: 12 22輸出結(jié)果: a=12,b=22 max=22,min=12 (b) (c)指針變化示意圖1222ppapb1222ppapbpapbab ab ab2. 指針的算術(shù)運(yùn)算 (1) 加減運(yùn)算: 一個(gè)指針可以加、減一個(gè)整數(shù)n,其結(jié)果與指針?biāo)笇?duì)象的數(shù)據(jù)類
11、型有關(guān)。指針變量的值應(yīng)增加或減少“nsizeof(指針類型)”。 加減運(yùn)算常用于數(shù)組的處理。對(duì)指向一般數(shù)據(jù)的指針,加減運(yùn)算無實(shí)際意義。例如: int a10,*p=a,*x; x=p+3; /*實(shí)際上是p加上3*2個(gè)字節(jié)賦給x, x指向數(shù)組的第三個(gè)分量*/ 對(duì)于不同基類型的指針,指針變量“加上”或“減去”一個(gè)整數(shù)n所移動(dòng)的字節(jié)數(shù)是不同的。例如: float a10, *p=a, *x; p=p+3; /*實(shí)際上是p加上3*4個(gè)字節(jié)賦給x, x依然指向數(shù)組的第三個(gè)分量*/ (2) 自增自減運(yùn)算指針變量自增、自減運(yùn)算具有上述運(yùn)算的特點(diǎn),但有前置后置、先用后用的考慮,務(wù)請(qǐng)小心。 例如: int a1
12、0, *p=a, *x; x=p+; /* x第一個(gè)元素分量, p指向第二個(gè)元素*/ x=+p; /* x、 p均指向數(shù)組的第二個(gè)分量*/* p+相當(dāng)于*(p+ +)。*(p+)與(*p)+ 含義不同,前者表示地址自增,后者表示當(dāng)前所指向的數(shù)據(jù)自增。 2. *&a的含意是什么? (答:a )3. (*p)+相當(dāng)于什么? (答:a+ )思考:1.若有定義 int a,*p; 執(zhí)行了“p=&a”,則: “&*p”的含意是什么?(答:相當(dāng)于&a )3.指針的關(guān)系運(yùn)算 與基本類型變量一樣,指針可以進(jìn)行關(guān)系運(yùn)算。在關(guān)系表達(dá)式中允許對(duì)兩個(gè)指針進(jìn)行所有的關(guān)系運(yùn)算。若p,q是兩個(gè)同類型的指針變量,則:pq,p
13、=q都是允許的。 指針的關(guān)系運(yùn)算在指向數(shù)組的指針中廣泛的運(yùn)用,假設(shè) p、q是指向同一數(shù)組的兩個(gè)指針,執(zhí)行pq的運(yùn)算,其含義為,若表達(dá)式結(jié)果為真(非值),則說明p所指元素在q所指元素之后?;蛘哒fq所指元素離數(shù)組第一個(gè)元素更近些。 注意:在指針進(jìn)行關(guān)系運(yùn)算之前,指針必須指向確定的變量或存儲(chǔ)區(qū)域,即指針有初始值;另外,只有相同類型的指針才能進(jìn)行比較。 8.1.4 多級(jí)指針 把指向指針型數(shù)據(jù)的指針變量稱為指向指針的指針,或稱多級(jí)指針。二級(jí)指針的定義形式如下: 數(shù)據(jù)類型 *指針變量例如: int a,*p,*pp; a=22; p=&a; pp=&p;假設(shè)變量a的地址為4000,指針p的地址為4100,
14、二級(jí)指針pp的地址為4800。a、p、pp三者的關(guān)系如上圖。&p=4100&a=400022pp(4800) p(4100) a(4000)8.2 指針與函數(shù)8.2.1 指針作為函數(shù)參數(shù) 利用指針作函數(shù)參數(shù),可以實(shí)現(xiàn)函數(shù)之間多個(gè)數(shù)據(jù)的傳遞,當(dāng)形參為指針變量時(shí),其對(duì)應(yīng)實(shí)參可以是指針變量或存儲(chǔ)單元地址。 (1)函數(shù)形參為指針變量,用指針變量作為實(shí)參 (2)函數(shù)形參為指針變量,用變量地址作為實(shí)參例8.3 編寫一個(gè)交換兩個(gè)變量的函數(shù),在主程序中 調(diào)用,實(shí)現(xiàn)兩個(gè)變量值的交換。程序如下:#includemain() int a,b; int *pa,*pb; void swap(int *p1,int *
15、p2); /*函數(shù)聲明*/ scanf(%d%d,&a,&b); pa=&a; /* pa指向變量a */ pb=&b; /* pb指向變量b */ swap(pa,pb); printf(na=%d,b=%dn,a,b);或:swap(&a,&b);void swap(int *p1,int *p2)int temp; temp=*p1; *p1=*p2; *p2=temp; 程序運(yùn)行結(jié)果如下: 輸入: 12 22 輸出: a=22,b=12兩點(diǎn)說明: (1) 若在函數(shù)體中交換指針變量的值,實(shí)參a、b的值并不改變,指針參數(shù)亦是傳值。 例如: int *p; p=p1; p1=p2; p2=p
16、; 不要希望如此完成處理。 (2) 函數(shù)中交換值時(shí)不能使用無初值的指針變量作臨時(shí)變量。 例如: int *p; *p=*p1; *p1=*p2; *p2=*p; p無確定值,對(duì) p的使用可能帶來不可預(yù)期的后果。8.2.2 指針函數(shù)指針函數(shù):是指返回值為指針的函數(shù)指針函數(shù)的定義形式: 類型標(biāo)示符 *函數(shù)名(參數(shù))例如:int *fun(int a,int b) 函數(shù)體語句 在函數(shù)體中有返回指針或地址的語句,形如: return (&變量名);或 return (指針變量);并且返回值的類型要與函數(shù)類型一致。 例8.3 分析如下程序main( ) int a,b,*p; int *max(int
17、x,int y); scanf(“%d,%d”,&a,&b); p=max(a,b); printf(“max=%d”,*p); int *max(int x,int y) if (xy) return (&x); else return (&y); 8.2.3 指向函數(shù)的指針 一個(gè)函數(shù)包括一組指令序列,存儲(chǔ)在某一段內(nèi)存中,這段內(nèi)存空間的起始地址稱為函數(shù)的入口地址 稱函數(shù)入口地址為函數(shù)的指針。函數(shù)名代表函數(shù)的入口地址 可以定義一個(gè)指針變量,其值等于該函數(shù)的入口地址,指向這個(gè)函數(shù),這樣通過這個(gè)指針變量也能調(diào)用這個(gè)函數(shù)。這種指針變量稱為指向函數(shù)的指針變量。定義指向函數(shù)的指針變量的一般形式為: 類型
18、標(biāo)識(shí)符(*指針變量名)( ); 例如: int (*p)(); /* 指針變量p可以指向一個(gè)整型函數(shù)*/ float (*q)(); /* 指針變量q可以指向一個(gè)浮點(diǎn)型函數(shù)*/ 剛定義的指向函數(shù)的指針變量,亦象其它指針變量一樣要賦以地址值才能引用。當(dāng)將某個(gè)函數(shù)的入口地址賦給指向函數(shù)的指針變量,就可用該指針變量來調(diào)用所指向的函數(shù) 給函數(shù)指針賦初值:將函數(shù)名(函數(shù)的入口地址值)賦給指針變量 例如 int m, (*p)( ); int max(int a,int b);則可以 p=max; /* p指向函數(shù)max() */指針調(diào)用函數(shù)的 一般形式為: (*指針變量)( 實(shí)參表); 如上例:m=(*
19、p)(12,22); /*比較 m=max(12,22); */注意: 用函數(shù)指針調(diào)用函數(shù)是間接調(diào)用,沒有參數(shù)類型說明,C編譯系統(tǒng)也無法進(jìn)行類型檢查,因此,在使用這種形式調(diào)用函數(shù)時(shí)要特別小心。實(shí)參一定要和指針?biāo)负瘮?shù)的形參類型一致。 函數(shù)指針可以作為函數(shù)參數(shù),此時(shí),當(dāng)函數(shù)指針每次指向不同的函數(shù)時(shí),可執(zhí)行不同的函數(shù)來完成不同的功能 例 8.4 函數(shù)max()用來求一維數(shù)組的元素的最大值,在主調(diào)函數(shù)中用函數(shù)名調(diào)用該函數(shù)與用函數(shù)指針調(diào)用該函數(shù)來實(shí)現(xiàn)。程序如下: #include stdio.h #define M 8 main() float sumf,sump; float aM=11,2,-3,
20、4.5,5,69,7,80; float (*p)(); /*定義指向函數(shù)的指針p*/ float max(float a,int n); /*函數(shù)聲明*/ p=max; /*函數(shù)名(函數(shù)入口地址)賦給指針p*/ sump=(*p)(a,M); /*用指針方式調(diào)用函數(shù)*/sumf=max(a,M); /*用函數(shù)名調(diào)用max()函數(shù)*/ printf(sump=%.2fn,sump); printf(sumf=%.2fn,sumf); 程序接上頁:float max(float a,int n) int k;float s;s=a0;for (k=0;kn;k+) if (sak) s=ak;
21、return s;程序運(yùn)行結(jié)果:sump=80.00 sumf=80.00指向函數(shù)的指針的使用步驟:(1) 定義一個(gè)指向函數(shù)的指針變量,形如: float (*p)();(2) 為函數(shù)指針賦值,格式如下: p=函數(shù)名; 注意:賦值時(shí)只需給出函數(shù)名,不要帶參數(shù)。(3) 通過函數(shù)指針調(diào)用函數(shù),調(diào)用格式如下: s=(*p)(實(shí)參);8.3 指針與數(shù)組8.3.1 指向一維數(shù)組的指針數(shù)組名是一個(gè)常量指針,它的值為該數(shù)組的首地址 1.指向數(shù)組的指針的定義方法與指向基本類型變量的指針的定義方法相同,例如:int a10=1,3,5,7,9;int *p;p=&a2; (把數(shù)組元素a2的地址賦給指針變量p)p
22、=a; (把數(shù)組的首地址賦給指針變量p)C語言規(guī)定:數(shù)組名代表數(shù)組首地址,是一個(gè)地址常量。因此,下面兩個(gè)語句等價(jià): p=&a0; p=a;在定義指針變量的同時(shí)可賦初值: int a10, *p=&a0; (或 int *p=a;)等價(jià)于:int *p; p=&a0; 兩句。指向數(shù)組的指針變量p&a013151719pa0:a9p9a+0p+1 或 a+1p+9 或 a+9*(a+9) 或*(p+9)2.通過指針引用數(shù)組元素 *p=5;表示對(duì)p當(dāng)前所指的數(shù)組元素賦以一個(gè)值5。C規(guī)定:p+1指向數(shù)組的下一元素(而不是將p值簡(jiǎn)單地加1)。p+1意味著使p的原值(地址)加d個(gè)字節(jié)(d為一個(gè)數(shù)組元素所占
23、的字節(jié)數(shù))。如果p的初值為&a0,則:(1)p+i和a+i就是ai的地址,或者說它們指向a數(shù)組的第i個(gè)元素(見下頁圖)。(2)*(p+i)或*(a+i)是p+i或a+i所指向的數(shù)組元素,即ai。(3)指向數(shù)組的指針變量也可以帶下標(biāo),如pi與*(p+i)、 ai等價(jià) 。*(p+i)a數(shù)組a0a1a2aia9pp+1,a+1p+i, a+ip+9, a+9綜上所述,引用一個(gè)數(shù)組元素有二法:(1)下標(biāo)法:如ai形式;(2)指針法:如*(a+i)或 *(p+i)。其中a是數(shù)組名,p是指向數(shù)組的指針變量,其初值p=a。main()int a10;int i;for (i=0;i10;i+)scanf(%
24、d,&ai);printf(n);for (i=0;i10;i+)printf(%d, ai ) ;例8.5 用三種方法輸出數(shù)組全部元素。(1)下標(biāo)法main()int a10;int i;for (i=0;i10;i+)scanf(%d,&ai);printf(n);for (i=0;i10;i+)printf(%d, *(a+i) );(2)通過數(shù)組名計(jì)算數(shù)組元素地址,輸出元素的值(3)用指針變量指向數(shù)組元素main()int a10;int *p,i;for (i=0;i10;i+)scanf(%d,&ai);printf(n);for (p=a;p(a+10);p+)printf(%d
25、, *p ); 三種方法的比較:用下標(biāo)法比較直觀,能直接知道是第幾個(gè)元素;而用指針法則執(zhí)行效率更高。使用指針變量時(shí),應(yīng)注意:(1)指針變量可實(shí)現(xiàn)使本身的值改變。 P+合法;但a+不合法(a是數(shù)組名,代表數(shù)組首地址,在程序運(yùn)行中是固定不變的。)(2)要注意指針變量的當(dāng)前值。main()int a10;int *p, i;p=a;for ( ;pa+10;p+) scanf(%d,p);printf(n);for ( ;p(a+10);p+)printf(%d, *p ); 不能&p增加:p=a;(3)*p+相當(dāng)于*(p+),因?yàn)?與+優(yōu)先級(jí)相同,且結(jié)合方向從右向左,其作用是先獲得p指向變量的值,
26、然后執(zhí)行p=p+1;(4)*(p+)與*(+p)意義不同,后者是先p=p+1,再獲得p指向的變量值。 若p=a,則輸出*(p+)是先輸出a0,再讓p指向a;輸出*(+p)是先使p指向a,再輸出p所指的a。(5)(*p)+表示的是將p指向的變量值+ 8.3.2 二維數(shù)組與多維數(shù)組的指針表示法 1.二維數(shù)組的地址設(shè)有一個(gè)二維數(shù) 組a,它有三行四列: int a34;數(shù)組名a: 代表整個(gè)二維數(shù)組的首地址,也就是第0行的首地址。a+i: 代表第i行的首地址。(見下頁圖) 數(shù)組名a代表整個(gè)二維數(shù)組的首地址:a0a1a2a=19173111971523上圖 a數(shù)組包含三個(gè)元素:a0,a1,a2. 而每個(gè)元
27、素又是一個(gè)一維數(shù)組,它包含4個(gè)元素(即4個(gè)列元素),如:a0又包含:a00,a01,a02,a03.一維數(shù)組名ai: 代表第i 行的首地址,即第i行中第0列元素的地址(既&ai0)。ai+j: 代表第i行中的第j個(gè)元素的地址,即為&aij。注意:地址變化的單位數(shù)值在不同的場(chǎng)合的實(shí)際字節(jié)數(shù)是不同的:“a+1”中的“1”實(shí)際代表數(shù)組中一行元素所占的總字節(jié)數(shù);“ai+1”中的“1” 代表數(shù)組中一個(gè)元素所占的字節(jié)數(shù)。 a+2 a數(shù)組a0a1a2aa+1(2000)(2019)(2019)a代表第0行的首地址,a+1代表第1行的首地址,a+2代表第2行的首地址.每行存放4個(gè)整型數(shù)據(jù)(即1個(gè)元素占2個(gè)字節(jié)
28、),因此,這里 +1 的含義是: +4*2 = +8 個(gè)字節(jié). 2000120193201952019720199201911201913201915201917201819202021202223aa+1a+2a0+1a0+2a0+3行地址,元素地址的表示法例8.6 用指針表示法輸出二維數(shù)組的各元素。#includemain()static int a23=0,1,2,3,4,5; int k,j,*p; for (j=0;j2;j+) /* 方式1 */ for (k=0;k3;k+) printf(%5d,*(aj+k); /* aj是j行首地址,aj+k是j行k列元素的地址*/ put
29、char(n); putchar(n);接上頁:for (j=0;j2;j+) /* 方式2 */ for (k=0;k3;k+) printf(%5d,*(*(a+j)+k); /* *(a+j)是j行首地址,*(a+j)+k是j行k列元素的地址*/ putchar(n); p=a; /* p指向數(shù)組的第一個(gè)元素 */ for (j=0;j2;j+) /* 方式3 */ for (k=0;k=n) p+=n-1; /*指針指到要復(fù)制的第一個(gè)字符 */ for (;*p!=0;p+,q+) *q=*p; *q=0; /* 字符串以0 結(jié)尾 */ printf(String a : %sn,a)
30、; printf(String b : %sn,b); 輸入: 3輸出: computer mputer考慮一下,若輸出語句改為如下語句會(huì)如何?printf(“string a is :%sn”,p);printf(“string b is %sn”,q);8.4.2 字符串?dāng)?shù)組字符串?dāng)?shù)組:是指數(shù)組中的每個(gè)元素都是一個(gè)存 放字符串的數(shù)組。字符串?dāng)?shù)組可以用一個(gè)二維字符數(shù)組來存儲(chǔ)。例如:char languge3 10;數(shù)組的第一個(gè)下標(biāo)決定字符串的個(gè)數(shù),第二個(gè)下標(biāo)是字符串的最大長(zhǎng)度(實(shí)際最多9個(gè)字符,0占一位置)??梢詫?duì)字符串?dāng)?shù)組賦初值。例如:char languge3 10;=“Basic”,
31、“c+”, “pascal”8.5 指針數(shù)組與命令行參數(shù)8.5.1 指針數(shù)組 指針數(shù)組:是指針變量的集合。即它的每一個(gè)元素都是指針變量,且都具有相同的存儲(chǔ)類別和指向相同的數(shù)據(jù)類型。指針數(shù)組的定義形式為: 類型標(biāo)識(shí)符 *數(shù)組名數(shù)組長(zhǎng)度說明;例如: int *p10;由于 比*的優(yōu)先級(jí)高,因此p先與 10結(jié)合成p10,而p10正是數(shù)組的定義形式,共有10個(gè)元素。最后p10與*結(jié)合,表示它的各元素可以指向一個(gè)整型變量。指針數(shù)組廣泛應(yīng)用于對(duì)字符串的處理例如有定義: char *p3;定義了一個(gè)具有三個(gè)元素p0,p1,p2的指針數(shù)組。每個(gè)元素都可以指向一個(gè)字符數(shù)組,或字符串。若利用數(shù)組初始化,則:cha
32、r *p3= “Basic”, “c+”, “pascal”; P0指向字符串“Basic”;P0指向字符串“c+”;P0指向字符串“pascal” ;例8.9 字符指針數(shù)組的賦值 #define NULL 0 main( ) static char a =“Fortran”; static char b =“COBOL”; static char c =“Pascal”; int i; char *p4; p0=a; p1=b; p2=c; p3=NULL; for (i=0;pi!=NULL;i+) printf(“Language %d is %sn”,i+1,pi); 例8.10 有若
33、干本書,將書名按字典順序排序#include#includemain() char *bname=Programming in ANSI C,BASIC,Visual C+ 6.0 Programming ,TRUBO C 2.0; int i,m; void sort(char *name,int); m=sizeof(bname)/sizeof(char *); /*字符串個(gè)數(shù)*/ sort(bname,m); /* 排序,改變指針的連接關(guān)系*/ printf(n); for (i=0;im;i+) /* 輸出排序結(jié)果*/ printf(%8s,bnamei);void sort(char
34、 *name, int n) /*選擇排序*/char *t; int i,j,k; /* k記錄每趟最小值下標(biāo) */ for (i=0;in-1;i+) k=i; for (j=i+1;j0) k=j; /* 第j個(gè)元素更小*/ if (k!=i) /* 最小元素是該趟的第一個(gè)元素 則不需交換 */ t=namei;namei=namek;namek=t; 輸出結(jié)果為: BASIC Programming in ANSI C TRUBO C 2.0 Visual C+ 6.0 Programming 注意: (1)字符數(shù)組中每個(gè)元素可存放一個(gè)字符,而字符指針變量存放字符串首地址,而不是存放在
35、字符指針變量中。 (2)對(duì)字符數(shù)組,與普通數(shù)組一樣,不能對(duì)其進(jìn)行整體賦值,只能給各個(gè)元素賦值,而字符指針變量可以直接用字符串常量賦值。例如,若有如下定義: char a10; char *p;則語句 a=”computer”;是非法的,因?yàn)閿?shù)組名a是一個(gè)常量指針,不能對(duì)其賦值。只能對(duì)各個(gè)元素分別賦值: a0=c;a1=o;a2=m;a3=p;a7=r;但語句: p=”computer”; 是合法的。 8.5.2 指針數(shù)組與命令行參數(shù) 在操作系統(tǒng)命令狀態(tài)下,可以輸入程序或命令使其運(yùn)行,稱命令行狀態(tài)。輸入的命令(或運(yùn)行程序)及該命令(或程序)所需的參數(shù)稱為命令行參數(shù)。 如: copy fd fs
36、copy是文件拷貝命令,fd、fs是命令行參數(shù)。main函數(shù)是可以有參數(shù)的,但與普通函數(shù)不同。帶形參的main( )函數(shù)的一般形式是:main (int argc, char *argv ) 形參argc記錄命令行中字符串的個(gè)數(shù),argv是一個(gè)字符型指針數(shù)組,每一個(gè)元素順序指向命令行中的一個(gè)字符串。1.main()函數(shù)的形參與實(shí)參 main()函數(shù)由系統(tǒng)自動(dòng)調(diào)用,而不是被程序內(nèi)部的其它函數(shù)調(diào)用, main()函數(shù)所需的實(shí)參不可能由程序內(nèi)部得到,而是由系統(tǒng)傳送。 main()函數(shù)所需的實(shí)參與形參的傳遞方式也與一般函數(shù)的參數(shù)傳遞不同,實(shí)參是在命令行與程序名一同輸入,程序名和各實(shí)際參數(shù)之間都用空格分
37、隔。 格式為:執(zhí)行程序名 參數(shù)1 參數(shù)2 參數(shù)n形參argc為命令行中參數(shù)的個(gè)數(shù)(包括執(zhí)行程序名),其值大于或等于1,而不是象普通C語言函數(shù)一樣接受第一個(gè)實(shí)參。形參argv是一個(gè)指針數(shù)組,其元素依次指向命令行中以空格分開的各字符串。 即:第一個(gè)指針argv0指向的是程序名字符串,argv1指向參數(shù)1,argv2指向參數(shù)2,argvn 指向參數(shù)n。2.命令行參數(shù)的傳遞示例例8.11 分析下列程序,指出其執(zhí)行結(jié)果,該程序命名為exam.c,經(jīng)編譯連接后生成的可執(zhí)行程序?yàn)閑xam.exe #include main (int argc , char * argv ) int i=0; printf(“argc=%dn”,argc); while (argc =1) printf(“n參數(shù)%d:%s”,i,*argv); i+; argc-;argv+; 輸出結(jié)果: argc
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- GB/T 20972.3-2025石油天然氣工業(yè)油氣開采中用于含硫化氫環(huán)境的材料第3部分:抗開裂耐蝕合金和其他合金
- 醫(yī)院門禁施工方案
- 河邊堤壩加固施工方案
- 快拼箱施工方案
- 富錦打井施工方案
- 我的中國夢(mèng)作文100字篇
- 二零二五年度燃?xì)庑孤﹫?bào)警器安裝合同
- 二零二五年度餐飲單位市場(chǎng)拓展合作合同
- 二零二五年度房屋出租中介服務(wù)合同(含租賃合同解除條件)
- 管理系統(tǒng)中計(jì)算機(jī)應(yīng)用詳細(xì)課件
- 《多維度兒童智力診斷量表》MIDSC的編制
- 慢阻肺從急性加重期到穩(wěn)定期的全程管理
- 2023年上海市普陀區(qū)高考?xì)v史二模試卷及答案解析
- 瑞達(dá)峰環(huán)境友好型高附加值關(guān)鍵醫(yī)藥中間體、特色原料藥及 GMP 成品藥(仿制藥與創(chuàng)新藥)規(guī)?;a(chǎn)項(xiàng)目(一期)環(huán)評(píng)報(bào)告書
- 嚴(yán)重創(chuàng)傷的急救處理
- GB/T 19870-2018工業(yè)檢測(cè)型紅外熱像儀
- GB/T 1228-2006鋼結(jié)構(gòu)用高強(qiáng)度大六角頭螺栓
- 國際商法 吳建斌課件 思考題答案
- 高等儀器分析第1章-緒論課件
- 怎樣聽課、評(píng)課課件
評(píng)論
0/150
提交評(píng)論