




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、第八章 指針本章要求理解指針的概念;掌握指針變量的定義和使用方法;掌握指針變量作函數(shù)參數(shù)時,數(shù)據(jù)的傳遞方式;掌握使用指針處理一維、二維數(shù)組的方法;掌握使用指針處理字符串的方法。 本章重點指針變量的定義和使用指針變量作函數(shù)參數(shù)使用指針處理一維數(shù)組和字符串本章難點使用指針處理一維、二維數(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)存是計算機用于存儲數(shù)據(jù)的存儲器,以一個字節(jié)作為存儲單元,為了便于訪問,給每個字節(jié)單元一個唯一的編號,
2、第一字節(jié)單元編號為0,以后各單元按順序連續(xù)編號,這些單元編號稱為內(nèi)存單元的地址 。 變量地址:變量所分配存儲空間的首字節(jié)單元地址(字節(jié)單元編號)。 3 6 7 8 1516 A公司B公司C公司一排平房 叫地址 2. 變量的三要素:名字、類型與值 每個變量都通過變量名與相應(yīng)的存儲單元相連系,具體分配哪些單元給變量,由編譯系統(tǒng)完成變量名到對應(yīng)內(nèi)存單元地址的變換。 變量分配存儲空間的大小由類型決定。 變量的值則是指相應(yīng)存儲單元的內(nèi)容。 3.內(nèi)存存取方式 直接存?。喊阎苯影醋兞棵虻刂反嫒∽兞恐档姆绞椒Q為 “直接存取”方式。 間接存?。和ㄟ^定義一種特殊的變量專門存放內(nèi)存或變量的地址,然后根據(jù)該地址值再
3、去訪問相應(yīng)的存儲單元 。將要訪問變量a的地址存放在另一個變量p中,當需要訪問變量a時,先取出變量p的內(nèi)容即變量a的地址,再根據(jù)此地址找到變量a所對應(yīng)的存儲空間。 這種間接的通過變量p得到變量a的地址,再存取變量a的值的方式即為“間接存取”。能夠存放其它變量地址的變量稱作指針變量 通常稱變量p指向變量a,變量a是變量p所指向的對象400012345400040024800pap(4800) p(4800) a(4000) 4000123454000間接存取示意圖4、指針的概念 在語言中,用指針來表示一個變量指向另一個變量這樣的指向關(guān)系。指針和指針變量 指針:是一個變量的地址 指針變量:用來存儲變
4、量地址(指針)的變量如:p即是一個指針變量,它存放的是a的地址4000。8.1.2 指針變量的定義與初始化1. 指針變量的定義 類型標識符 *指針變量名;例:float *p1; (定義p1為指向?qū)嵭妥兞康闹羔樧兞? char *p2; (定義p2為指向字符型變量的指針變量)在指針變量定義中,*是一個說明符,它表明其后的變量是指針變量,如p是指針變量,而不要認為“*p”是指針變量。指針變量定義時指定的數(shù)據(jù)類型不是指針變量本身(變量存放的值)的數(shù)據(jù)類型,而是指針變量所指向的對象(或稱目標)的數(shù)據(jù)類型 指針變量存放的是所指向的某個變量的地址值,而普通變量保存的是該變量本身的值 指針變量并不固定指向
5、一個變量,可指向同類型的不同變量2. 指針運算符與地址運算符 與指針引用有關(guān)的兩個運算符:&與*。 &: 取地址運算符 *:指針運算符,或稱指向運算符、間接訪問運算 符。指針指向的對象的表示形式: * 指針變量此處*是訪問指針所指對象的運算符,與指針定義時的*不同。3. 指針變量初始化若有定義: int a,*p;語句僅僅定義了指針變量p,但指針變量并未指向確定的變量(或內(nèi)存單元)。因為這些指針變量還沒有賦給確定的地址值,只有將某一具體變量的地址賦給指針變量之后,指針變量才指向確定的變量(內(nèi)存單元)。指針變量初始化:在定義指針時同時給指針一個初始值如: int a,*p=&a;40003a(4
6、000)p*p4. 指針變量的引用 *指針變量名代表所指變量的值。 指針變量名代表所指變量的地址。有定義: int a,*p=&a;用*p來表示p指向的對象a,*p與a是等價的。 *p可以象普通變量一樣使用。 例如: a=12; *p=12; scanf(%d,&*p); scanf(%d,p); printf(“%d%d”,*p,a);注意:*與&具有相同的優(yōu)先級,結(jié)合方向從右到左。這樣,&*p即&(*p),是對變量*p取地址,它與&a等價;p與&(*p)等價,a與*(&a)等價。 8.1.3 指針運算1. 指針的賦值運算(1)將變量地址值賦給指針變量,使指針指向該變量。設(shè)有如下定義: in
7、t a,b,*pa,*pb; float *pf;第一行定義了整型變量a,b及指針變量pa,pb。pa、pb還沒有被賦值,因此pa、pb沒有指向任何變量, 下面語句完成對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,此時a、*pa、*pb是等價的。指針指向變化如下圖:注意:只有相同類型的指針變量才能相互賦值,
8、如pf=pa;是不允許的。因為pa是整型指針,pf是浮點型指針。&a&bpapba,*pab,*pb&a&apapba,*pa,*pbb()給指針變量賦空值 給指針變量賦空值,說明該指針不指向任何變量。 “空”指針值用NULL表示,NULL是在頭文件stdio.h中預(yù)定義的常量,其值為,在使用時應(yīng)加上預(yù)定義行,如: #include stdio.h int *pa=NULL; 亦可以用下面的語句給指針賦“空值”: pa=0; 或: pa=0; 這里指針pa并非指向0地址單元,而是具有一個確定的“空值”,表示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); 程序運行結(jié)果:100,10100,10&a&bbpointer_1pointer_2a*pointer_1*pointer_2例8.2 從鍵盤上輸入兩個整數(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; /*進行指針交換,如下頁圖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ù)運算 (1) 加減運算: 一個指針可以加、減一個整數(shù)n,其結(jié)果與指針所指對象的數(shù)據(jù)類
11、型有關(guān)。指針變量的值應(yīng)增加或減少“nsizeof(指針類型)”。 加減運算常用于數(shù)組的處理。對指向一般數(shù)據(jù)的指針,加減運算無實際意義。例如: int a10,*p=a,*x; x=p+3; /*實際上是p加上3*2個字節(jié)賦給x, x指向數(shù)組的第三個分量*/ 對于不同基類型的指針,指針變量“加上”或“減去”一個整數(shù)n所移動的字節(jié)數(shù)是不同的。例如: float a10, *p=a, *x; p=p+3; /*實際上是p加上3*4個字節(jié)賦給x, x依然指向數(shù)組的第三個分量*/ (2) 自增自減運算指針變量自增、自減運算具有上述運算的特點,但有前置后置、先用后用的考慮,務(wù)請小心。 例如: int a1
12、0, *p=a, *x; x=p+; /* x第一個元素分量, p指向第二個元素*/ x=+p; /* x、 p均指向數(shù)組的第二個分量*/* p+相當于*(p+ +)。*(p+)與(*p)+ 含義不同,前者表示地址自增,后者表示當前所指向的數(shù)據(jù)自增。 2. *&a的含意是什么? (答:a )3. (*p)+相當于什么? (答:a+ )思考:1.若有定義 int a,*p; 執(zhí)行了“p=&a”,則: “&*p”的含意是什么?(答:相當于&a )3.指針的關(guān)系運算 與基本類型變量一樣,指針可以進行關(guān)系運算。在關(guān)系表達式中允許對兩個指針進行所有的關(guān)系運算。若p,q是兩個同類型的指針變量,則:pq,p
13、=q都是允許的。 指針的關(guān)系運算在指向數(shù)組的指針中廣泛的運用,假設(shè) p、q是指向同一數(shù)組的兩個指針,執(zhí)行pq的運算,其含義為,若表達式結(jié)果為真(非值),則說明p所指元素在q所指元素之后?;蛘哒fq所指元素離數(shù)組第一個元素更近些。 注意:在指針進行關(guān)系運算之前,指針必須指向確定的變量或存儲區(qū)域,即指針有初始值;另外,只有相同類型的指針才能進行比較。 8.1.4 多級指針 把指向指針型數(shù)據(jù)的指針變量稱為指向指針的指針,或稱多級指針。二級指針的定義形式如下: 數(shù)據(jù)類型 *指針變量例如: int a,*p,*pp; a=22; p=&a; pp=&p;假設(shè)變量a的地址為4000,指針p的地址為4100,
14、二級指針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ù),可以實現(xiàn)函數(shù)之間多個數(shù)據(jù)的傳遞,當形參為指針變量時,其對應(yīng)實參可以是指針變量或存儲單元地址。 (1)函數(shù)形參為指針變量,用指針變量作為實參 (2)函數(shù)形參為指針變量,用變量地址作為實參例8.3 編寫一個交換兩個變量的函數(shù),在主程序中 調(diào)用,實現(xiàn)兩個變量值的交換。程序如下:#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; 程序運行結(jié)果如下: 輸入: 12 22 輸出: a=22,b=12兩點說明: (1) 若在函數(shù)體中交換指針變量的值,實參a、b的值并不改變,指針參數(shù)亦是傳值。 例如: int *p; p=p1; p1=p2; p2=p
16、; 不要希望如此完成處理。 (2) 函數(shù)中交換值時不能使用無初值的指針變量作臨時變量。 例如: int *p; *p=*p1; *p1=*p2; *p2=*p; p無確定值,對 p的使用可能帶來不可預(yù)期的后果。8.2.2 指針函數(shù)指針函數(shù):是指返回值為指針的函數(shù)指針函數(shù)的定義形式: 類型標示符 *函數(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ù)的指針 一個函數(shù)包括一組指令序列,存儲在某一段內(nèi)存中,這段內(nèi)存空間的起始地址稱為函數(shù)的入口地址 稱函數(shù)入口地址為函數(shù)的指針。函數(shù)名代表函數(shù)的入口地址 可以定義一個指針變量,其值等于該函數(shù)的入口地址,指向這個函數(shù),這樣通過這個指針變量也能調(diào)用這個函數(shù)。這種指針變量稱為指向函數(shù)的指針變量。定義指向函數(shù)的指針變量的一般形式為: 類型
18、標識符(*指針變量名)( ); 例如: int (*p)(); /* 指針變量p可以指向一個整型函數(shù)*/ float (*q)(); /* 指針變量q可以指向一個浮點型函數(shù)*/ 剛定義的指向函數(shù)的指針變量,亦象其它指針變量一樣要賦以地址值才能引用。當將某個函數(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ù)的 一般形式為: (*指針變量)( 實參表); 如上例:m=(*
19、p)(12,22); /*比較 m=max(12,22); */注意: 用函數(shù)指針調(diào)用函數(shù)是間接調(diào)用,沒有參數(shù)類型說明,C編譯系統(tǒng)也無法進行類型檢查,因此,在使用這種形式調(diào)用函數(shù)時要特別小心。實參一定要和指針所指函數(shù)的形參類型一致。 函數(shù)指針可以作為函數(shù)參數(shù),此時,當函數(shù)指針每次指向不同的函數(shù)時,可執(zhí)行不同的函數(shù)來完成不同的功能 例 8.4 函數(shù)max()用來求一維數(shù)組的元素的最大值,在主調(diào)函數(shù)中用函數(shù)名調(diào)用該函數(shù)與用函數(shù)指針調(diào)用該函數(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;程序運行結(jié)果:sump=80.00 sumf=80.00指向函數(shù)的指針的使用步驟:(1) 定義一個指向函數(shù)的指針變量,形如: float (*p)();(2) 為函數(shù)指針賦值,格式如下: p=函數(shù)名; 注意:賦值時只需給出函數(shù)名,不要帶參數(shù)。(3) 通過函數(shù)指針調(diào)用函數(shù),調(diào)用格式如下: s=(*p)(實參);8.3 指針與數(shù)組8.3.1 指向一維數(shù)組的指針數(shù)組名是一個常量指針,它的值為該數(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ù)組首地址,是一個地址常量。因此,下面兩個語句等價: p=&a0; p=a;在定義指針變量的同時可賦初值: int a10, *p=&a0; (或 int *p=a;)等價于:int *p; p=&a0; 兩句。指向數(shù)組的指針變量p&a013151719pa0:a9p9a+0p+1 或 a+1p+9 或 a+9*(a+9) 或*(p+9)2.通過指針引用數(shù)組元素 *p=5;表示對p當前所指的數(shù)組元素賦以一個值5。C規(guī)定:p+1指向數(shù)組的下一元素(而不是將p值簡單地加1)。p+1意味著使p的原值(地址)加d個字節(jié)(d為一個數(shù)組元素所占
23、的字節(jié)數(shù))。如果p的初值為&a0,則:(1)p+i和a+i就是ai的地址,或者說它們指向a數(shù)組的第i個元素(見下頁圖)。(2)*(p+i)或*(a+i)是p+i或a+i所指向的數(shù)組元素,即ai。(3)指向數(shù)組的指針變量也可以帶下標,如pi與*(p+i)、 ai等價 。*(p+i)a數(shù)組a0a1a2aia9pp+1,a+1p+i, a+ip+9, a+9綜上所述,引用一個數(shù)組元素有二法:(1)下標法:如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)下標法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ù)組名計算數(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 ); 三種方法的比較:用下標法比較直觀,能直接知道是第幾個元素;而用指針法則執(zhí)行效率更高。使用指針變量時,應(yīng)注意:(1)指針變量可實現(xiàn)使本身的值改變。 P+合法;但a+不合法(a是數(shù)組名,代表數(shù)組首地址,在程序運行中是固定不變的。)(2)要注意指針變量的當前值。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+相當于*(p+),因為*與+優(yōu)先級相同,且結(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è)有一個二維數(shù) 組a,它有三行四列: int a34;數(shù)組名a: 代表整個二維數(shù)組的首地址,也就是第0行的首地址。a+i: 代表第i行的首地址。(見下頁圖) 數(shù)組名a代表整個二維數(shù)組的首地址:a0a1a2a=19173111971523上圖 a數(shù)組包含三個元素:a0,a1,a2. 而每個元
27、素又是一個一維數(shù)組,它包含4個元素(即4個列元素),如:a0又包含:a00,a01,a02,a03.一維數(shù)組名ai: 代表第i 行的首地址,即第i行中第0列元素的地址(既&ai0)。ai+j: 代表第i行中的第j個元素的地址,即為&aij。注意:地址變化的單位數(shù)值在不同的場合的實際字節(jié)數(shù)是不同的:“a+1”中的“1”實際代表數(shù)組中一行元素所占的總字節(jié)數(shù);“ai+1”中的“1” 代表數(shù)組中一個元素所占的字節(jié)數(shù)。 a+2 a數(shù)組a0a1a2aa+1(2000)(2019)(2019)a代表第0行的首地址,a+1代表第1行的首地址,a+2代表第2行的首地址.每行存放4個整型數(shù)據(jù)(即1個元素占2個字節(jié)
28、),因此,這里 +1 的含義是: +4*2 = +8 個字節(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ù)組的第一個元素 */ for (j=0;j2;j+) /* 方式3 */ for (k=0;k=n) p+=n-1; /*指針指到要復制的第一個字符 */ 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考慮一下,若輸出語句改為如下語句會如何?printf(“string a is :%sn”,p);printf(“string b is %sn”,q);8.4.2 字符串數(shù)組字符串數(shù)組:是指數(shù)組中的每個元素都是一個存 放字符串的數(shù)組。字符串數(shù)組可以用一個二維字符數(shù)組來存儲。例如:char languge3 10;數(shù)組的第一個下標決定字符串的個數(shù),第二個下標是字符串的最大長度(實際最多9個字符,0占一位置)。可以對字符串數(shù)組賦初值。例如:char languge3 10;=“Basic”,
31、“c+”, “pascal”8.5 指針數(shù)組與命令行參數(shù)8.5.1 指針數(shù)組 指針數(shù)組:是指針變量的集合。即它的每一個元素都是指針變量,且都具有相同的存儲類別和指向相同的數(shù)據(jù)類型。指針數(shù)組的定義形式為: 類型標識符 *數(shù)組名數(shù)組長度說明;例如: int *p10;由于 比*的優(yōu)先級高,因此p先與 10結(jié)合成p10,而p10正是數(shù)組的定義形式,共有10個元素。最后p10與*結(jié)合,表示它的各元素可以指向一個整型變量。指針數(shù)組廣泛應(yīng)用于對字符串的處理例如有定義: char *p3;定義了一個具有三個元素p0,p1,p2的指針數(shù)組。每個元素都可以指向一個字符數(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 *); /*字符串個數(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記錄每趟最小值下標 */ for (i=0;in-1;i+) k=i; for (j=i+1;j0) k=j; /* 第j個元素更小*/ if (k!=i) /* 最小元素是該趟的第一個元素 則不需交換 */ t=namei;namei=namek;namek=t; 輸出結(jié)果為: BASIC Programming in ANSI C TRUBO C 2.0 Visual C+ 6.0 Programming 注意: (1)字符數(shù)組中每個元素可存放一個字符,而字符指針變量存放字符串首地址,而不是存放在
35、字符指針變量中。 (2)對字符數(shù)組,與普通數(shù)組一樣,不能對其進行整體賦值,只能給各個元素賦值,而字符指針變量可以直接用字符串常量賦值。例如,若有如下定義: char a10; char *p;則語句 a=”computer”;是非法的,因為數(shù)組名a是一個常量指針,不能對其賦值。只能對各個元素分別賦值: a0=c;a1=o;a2=m;a3=p;a7=r;但語句: p=”computer”; 是合法的。 8.5.2 指針數(shù)組與命令行參數(shù) 在操作系統(tǒng)命令狀態(tài)下,可以輸入程序或命令使其運行,稱命令行狀態(tài)。輸入的命令(或運行程序)及該命令(或程序)所需的參數(shù)稱為命令行參數(shù)。 如: copy fd fs
36、copy是文件拷貝命令,fd、fs是命令行參數(shù)。main函數(shù)是可以有參數(shù)的,但與普通函數(shù)不同。帶形參的main( )函數(shù)的一般形式是:main (int argc, char *argv ) 形參argc記錄命令行中字符串的個數(shù),argv是一個字符型指針數(shù)組,每一個元素順序指向命令行中的一個字符串。1.main()函數(shù)的形參與實參 main()函數(shù)由系統(tǒng)自動調(diào)用,而不是被程序內(nèi)部的其它函數(shù)調(diào)用, main()函數(shù)所需的實參不可能由程序內(nèi)部得到,而是由系統(tǒng)傳送。 main()函數(shù)所需的實參與形參的傳遞方式也與一般函數(shù)的參數(shù)傳遞不同,實參是在命令行與程序名一同輸入,程序名和各實際參數(shù)之間都用空格分
37、隔。 格式為:執(zhí)行程序名 參數(shù)1 參數(shù)2 參數(shù)n形參argc為命令行中參數(shù)的個數(shù)(包括執(zhí)行程序名),其值大于或等于1,而不是象普通C語言函數(shù)一樣接受第一個實參。形參argv是一個指針數(shù)組,其元素依次指向命令行中以空格分開的各字符串。 即:第一個指針argv0指向的是程序名字符串,argv1指向參數(shù)1,argv2指向參數(shù)2,argvn 指向參數(shù)n。2.命令行參數(shù)的傳遞示例例8.11 分析下列程序,指出其執(zhí)行結(jié)果,該程序命名為exam.c,經(jīng)編譯連接后生成的可執(zhí)行程序為exam.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等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年捐款協(xié)議模板
- 二年級上冊數(shù)學教案-除法的初步認識(2)-西師大版
- 三年級上冊數(shù)學教學設(shè)計-5.1什么是周長 北師大版
- 六年級下冊數(shù)學教案-第一單元第3課時 問題解決(1) 西師大版
- 2025年購房合同模板文件
- 借住合同(2025年版)
- 學習2025年雷鋒精神六十二周年主題活動實施方案 (3份)-98
- 2025年學習雷鋒精神六十二周年主題活動方案
- 《線段、射線和直線》(教學設(shè)計)-2024-2025學年四年級上冊數(shù)學冀教版
- 《小小設(shè)計師》(教學設(shè)計)-2023-2024學年二年級下冊數(shù)學人教版
- 2025年《贏在執(zhí)行》心得體會(4篇)
- 核心素養(yǎng)導向下的小學語文跨學科學習研究
- 小紅書搜索推廣營銷師認證考試題(附答案)
- T-GDSAIA 001-2024 非充氣彈性支撐輪 術(shù)語及其定義
- 湖南省長沙市2024年七年級上學期期末數(shù)學試卷【附答案】
- 護苗行動課件
- 《人工授精雞》課件
- 現(xiàn)代旅游管理專業(yè)群教學資源庫可行性建設(shè)研究報告
- (2024年更新)國家慢性疾病編碼新目錄
- 《腦膠質(zhì)瘤診療指南2024版》解讀
- 心肺復蘇術(shù)課件2024新版
評論
0/150
提交評論