版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、 實(shí)驗(yàn)九實(shí)驗(yàn)九 指針指針(一一) 實(shí)驗(yàn)內(nèi)容:實(shí)驗(yàn)內(nèi)容:4 實(shí)驗(yàn)九實(shí)驗(yàn)九 指針指針(二二) 實(shí)驗(yàn)內(nèi)容:實(shí)驗(yàn)內(nèi)容:4上機(jī)作業(yè)上機(jī)作業(yè)指針指針 指針是指針是C C語(yǔ)言的一個(gè)重要特色,是一種數(shù)據(jù)類(lèi)型,指針的作用語(yǔ)言的一個(gè)重要特色,是一種數(shù)據(jù)類(lèi)型,指針的作用是:是: 可對(duì)內(nèi)存中各種不同數(shù)據(jù)結(jié)構(gòu)的數(shù)據(jù)進(jìn)行可對(duì)內(nèi)存中各種不同數(shù)據(jù)結(jié)構(gòu)的數(shù)據(jù)進(jìn)行快速處理快速處理 為函數(shù)間各類(lèi)數(shù)據(jù)的傳遞提供了簡(jiǎn)捷便利的方法為函數(shù)間各類(lèi)數(shù)據(jù)的傳遞提供了簡(jiǎn)捷便利的方法 利用指針可以編制出簡(jiǎn)潔明快、功能強(qiáng)和質(zhì)量高的程序利用指針可以編制出簡(jiǎn)潔明快、功能強(qiáng)和質(zhì)量高的程序可以說(shuō)沒(méi)掌握指針就沒(méi)有掌握可以說(shuō)沒(méi)掌握指針就沒(méi)有掌握C的精華。的精華。
2、 本章將主要介紹以下內(nèi)容本章將主要介紹以下內(nèi)容: 指針變量的定義指針變量的定義 指針與數(shù)組指針與數(shù)組 指針數(shù)組指針數(shù)組 指針與函數(shù)指針與函數(shù)指針變量的定義指針變量的定義v 地址及訪問(wèn)方式地址及訪問(wèn)方式 變量的地址是指變量在存儲(chǔ)區(qū)變量的地址是指變量在存儲(chǔ)區(qū)域中的物理位置。訪問(wèn)變量有兩種域中的物理位置。訪問(wèn)變量有兩種方式:方式:直接訪問(wèn)直接訪問(wèn) 指通過(guò)變量名或地址直指通過(guò)變量名或地址直接訪問(wèn)接訪問(wèn)變量的變量的值值;間接訪問(wèn)間接訪問(wèn) 指把一個(gè)變量的地址指把一個(gè)變量的地址放在另一個(gè)變量中放在另一個(gè)變量中(稱(chēng)地址變量稱(chēng)地址變量)然然后通過(guò)先找出地址變量的值,再由后通過(guò)先找出地址變量的值,再由此地址找到最
3、終要訪問(wèn)的變量值此地址找到最終要訪問(wèn)的變量值v 指針與指針變量指針與指針變量 指針指針就是地址,一個(gè)變量的指針就是地址,一個(gè)變量的指針 : : 58 23 12 3 : :2000變量i變量j變量k變量m2000200220042006變量p就是指該變量的地址,存放地址的變量就是就是指該變量的地址,存放地址的變量就是指針變量指針變量。3500v指針變量的定義指針變量的定義 : : 10 20 : : 3000 3002abp1p230003002 : : 10 20 : : 3000 3000 它和普通變量一樣占用一定的存儲(chǔ)空間,但指針變量的存它和普通變量一樣占用一定的存儲(chǔ)空間,但指針變量的存
4、儲(chǔ)空間中存放的不是普通的數(shù)據(jù),而是一個(gè)地址,因此儲(chǔ)空間中存放的不是普通的數(shù)據(jù),而是一個(gè)地址,因此指針變指針變量是一個(gè)地址變量量是一個(gè)地址變量。存儲(chǔ)類(lèi)型存儲(chǔ)類(lèi)型 數(shù)據(jù)數(shù)據(jù)類(lèi)型類(lèi)型 * *標(biāo)識(shí)符標(biāo)識(shí)符例例1 :main( ) int *p1, *p2 , a=10 , b=20 ; p1=&a ; p2=&b ; printf(“%d,%dn” , *p1 , *p2 ); p2=p1 ; printf(“%d,%dn” , *p1 , *p2 ); 結(jié)果為:結(jié)果為: 10, 20 10, 10注意:注意: 在變量說(shuō)明中:在變量說(shuō)明中:標(biāo)識(shí)名前的標(biāo)識(shí)名前的 * * 號(hào)僅是一個(gè)符號(hào),
5、表號(hào)僅是一個(gè)符號(hào),表示其后是一個(gè)指針變量名;數(shù)據(jù)類(lèi)型并不是指針變量示其后是一個(gè)指針變量名;數(shù)據(jù)類(lèi)型并不是指針變量本身的數(shù)據(jù)類(lèi)型,而是指針指向其目標(biāo)的數(shù)據(jù)類(lèi)型。本身的數(shù)據(jù)類(lèi)型,而是指針指向其目標(biāo)的數(shù)據(jù)類(lèi)型。 指針運(yùn)算符:指針運(yùn)算符: & 獲取運(yùn)算量的地址獲取運(yùn)算量的地址 。如:。如:scanf(“%f”,&a); * 獲取地址中的值獲取地址中的值 。 如:如: main() float a=10, b=20 , *p; p =&a; a+=b; *p/=b; (*p)+; printf(“n %”,*p); p+; printf(“n %”,*p);1020 : :500
6、5005043020 : :500abp1.520 : :5002.520 : :5042.520 : :500v 指針變量用作函數(shù)參量指針變量用作函數(shù)參量(e2)(e2)void swap(int *x, int *y) int temp; temp=*x; *x=*y; *y=temp; printf(n x=%d y=%d n,*x,*y);main() int a=10,b=20; swap(&a,&b); printf(n a=%d b=%d n,a,b);void swap(int x, int y)int temp; temp=x; x=y; y=temp; pr
7、intf(n x=%d y=%d n, x, y);main() int a=10,b=20; swap(a,b); printf(n a=%d b=%d n,a,b);10201020 a b x y temp10202010101020&a&b2010&a&b 10 a b x y temp假設(shè)已執(zhí)行假設(shè)已執(zhí)行 p=&a; 1、&*p含義是什么?含義是什么? 先進(jìn)行先進(jìn)行*p運(yùn)算運(yùn)算,得得a的值的值,再進(jìn)行再進(jìn)行&運(yùn)算運(yùn)算, &*p 與與 &a 相同,即變量相同,即變量a的地址。的地址。 2、*&a的含義是什么
8、?的含義是什么? 先進(jìn)行先進(jìn)行&a運(yùn)算,得運(yùn)算,得a的地址,再進(jìn)行的地址,再進(jìn)行*運(yùn)算。運(yùn)算。 *&a、*p及變量及變量a等價(jià)。等價(jià)。 3、(*p) + + 相當(dāng)于相當(dāng)于a + +。 它與它與*p + + 不同。不同。 4、*p + + 等價(jià)于等價(jià)于*(p + +),即先進(jìn)行,即先進(jìn)行*運(yùn)算,得到運(yùn)算,得到 a 的值,然后執(zhí)行的值,然后執(zhí)行p+,這樣,這樣 p 不再指向不再指向a了。了。 關(guān)于關(guān)于&和和*運(yùn)算符的說(shuō)明:運(yùn)算符的說(shuō)明:指針僅能進(jìn)行加、減算術(shù)運(yùn)算如:指針僅能進(jìn)行加、減算術(shù)運(yùn)算如: p+n,p-n,p+,p-,+p,-p, p-= n, p+= n,p1-p2
9、 等。等。 其中其中 n 是整數(shù),是整數(shù),p、p1、p2 均為指針;均為指針; 施行加法運(yùn)算時(shí),指針向地址增大的方向移動(dòng);施行加法運(yùn)算時(shí),指針向地址增大的方向移動(dòng); 施行減法運(yùn)算時(shí),指針向地址減小的方向移動(dòng);施行減法運(yùn)算時(shí),指針向地址減小的方向移動(dòng); 移動(dòng)長(zhǎng)度取決于指針的基類(lèi)型,由計(jì)算機(jī)決定移動(dòng)長(zhǎng)度取決于指針的基類(lèi)型,由計(jì)算機(jī)決定;v 指針的關(guān)系運(yùn)算指針的關(guān)系運(yùn)算 設(shè)指針設(shè)指針p1,p2指向同一數(shù)組中的元素,則:指向同一數(shù)組中的元素,則: p1、=、=、!=比較的意義;比較的意義; 允許將指針與允許將指針與NULL或數(shù)值或數(shù)值 0 進(jìn)行進(jìn)行 =或或 != 的比較,以便判的比較,以便判定一個(gè)指針
10、是否為空指針。定一個(gè)指針是否為空指針。注意:注意: 不可將指針與其他類(lèi)型的對(duì)象作比較;不可將指針與其他類(lèi)型的對(duì)象作比較; 若兩指針指向不同數(shù)組中的元素,也不可比較;若兩指針指向不同數(shù)組中的元素,也不可比較; v 指針的算術(shù)運(yùn)算指針的算術(shù)運(yùn)算指針與數(shù)組指針與數(shù)組 v 一維數(shù)組的指針表示方法一維數(shù)組的指針表示方法 C C語(yǔ)言規(guī)定數(shù)組名代表數(shù)組的首地址。語(yǔ)言規(guī)定數(shù)組名代表數(shù)組的首地址。如:如: int a10 , *p; 則則 : : p=&a0; 和和 p=a;兩語(yǔ)句等價(jià)兩語(yǔ)句等價(jià), ,其作用是把其作用是把 a 數(shù)組首地址賦給指針變量數(shù)組首地址賦給指針變量 p ,之,之后后 p+ i 就是
11、就是 ai 地址。地址。 a0 a1 a2 a3 a4 a5 a6 a7 a8 a9p,a p+0 p+1 p+2 p+3 p+4 p+5 p+6 p+7 p+8 p+9 引用數(shù)組方式:引用數(shù)組方式: i=0 9; 因此因此ai等價(jià)于等價(jià)于: * (p+i),*(a+i) a+0 a+1 a+2 a+3 a+4 a+5 a+6 a+7 a+8 a+9 ai *(a+i) *(p+i)#include “stdio.h” main() int a10, i ; for( i=0; i10 ; i+) ai=rand(); printf(“n”); for( i=0 ; i10; i+) prin
12、tf(“%d”,ai);#include “stdio.h”main() int a10, i ; for( i=0; i10 ; i+) *(a+i)=rand(); printf(“n”); for( i=0 ; i10; i+) printf(“%d”,*(a+i);#include “stdio.h”main() int a10, *p, i ; for(p=a;pa+10;p+) *p=rand(); printf(“n”); for(p=a;p(a+10);p+) printf(“%d”,*p );輸出數(shù)組中的全部元素輸出數(shù)組中的全部元素的值。使用下標(biāo)法、利用數(shù)組名計(jì)算地的值。使用
13、下標(biāo)法、利用數(shù)組名計(jì)算地址,找出元素的值、用指針變量指向數(shù)組元素。址,找出元素的值、用指針變量指向數(shù)組元素。(e3)比較一下:比較一下:用下標(biāo)法比較直觀;使用指針效率高。用下標(biāo)法比較直觀;使用指針效率高。v 數(shù)組名作函數(shù)參數(shù)數(shù)組名作函數(shù)參數(shù) 用數(shù)組名作實(shí)參,在調(diào)用函數(shù)時(shí)是把數(shù)組的首地用數(shù)組名作實(shí)參,在調(diào)用函數(shù)時(shí)是把數(shù)組的首地址傳送給形參。即實(shí)參數(shù)組與形參數(shù)組共占同一段內(nèi)址傳送給形參。即實(shí)參數(shù)組與形參數(shù)組共占同一段內(nèi)存。存。例例. 將數(shù)組將數(shù)組a中的中的n個(gè)整數(shù)按相反順序存放。個(gè)整數(shù)按相反順序存放。(e4) 分析:分析:將將a0與與an-1對(duì)換,再將對(duì)換,再將a1和和an-2對(duì)對(duì)換換。設(shè)。設(shè)i和
14、和j,i的初值為的初值為0,j的初值為的初值為n-1。將。將ai和和aj交換,然后使交換,然后使i的值加的值加1,j的值減的值減1,再將,再將ai和和aj交換,直到交換,直到 i=(n-1)/2為止。為止。 a0 a1 a2 a3 a4 a5 a6 a7 a8 a9i=0 4 , j=95 ai aj 參考程序void inv(int x, int n) int temp, i, j,m=(n-1)/2; for( i=0,j=n-1; i=m; i+,j-) temp=xi; xi=xj; xj=temp; main() int i, a10=3,7,9,11, 0,6,7,5,4,2; p
15、rintf(“nThe array: n ”); for( i=0; i10; i+) printf(“%4d”,ai); inv(a,10); printf(“n The array : n”); for( i=0; i10; i+) printf(“%4d”,ai); printf(“n”); 例、例、 從從10個(gè)數(shù)中找出其中最大值和最小值。個(gè)數(shù)中找出其中最大值和最小值。(e5) int max,min; void max_min_value(int a, int n) int *p,*a_end; a_end=a+n; max=min=*a; /* 等價(jià)等價(jià)max=min=a0 */ f
16、or(p=a+1;pmax) max=*p; else if (*pmin) min=*p; return; main() int i, number10; printf(“enter 10 integer number:n”); for( i=0; i10; i+) scanf(“%d”,&numberi); max_min_value(number,10); printf(“n max=%d,min=%dn”,max,min); 主函數(shù)主函數(shù)如果有一個(gè)實(shí)參數(shù)組,想在函數(shù)中改變此數(shù)組的元素的值,實(shí)參與如果有一個(gè)實(shí)參數(shù)組,想在函數(shù)中改變此數(shù)組的元素的值,實(shí)參與形參的對(duì)應(yīng)關(guān)系有以下形參的
17、對(duì)應(yīng)關(guān)系有以下4種情況:種情況:1、形參和實(shí)參都用數(shù)組名、形參和實(shí)參都用數(shù)組名f ( int x,int n ) a和和x指的是同一個(gè)數(shù)組指的是同一個(gè)數(shù)組 2、實(shí)參用數(shù)組名,形參用指針變量、實(shí)參用數(shù)組名,形參用指針變量f( int *x, int n ) 開(kāi)始時(shí),開(kāi)始時(shí),x指向指向a0main() inta10; f(a,10); main() int a10; f( a, 10 ); 3 、實(shí)參形參都用指針變量、實(shí)參形參都用指針變量 f ( int *x, int n ) . 實(shí)參實(shí)參p和形參和形參x都指向數(shù)組都指向數(shù)組a 4、實(shí)參為指針變量,形參為數(shù)組名。、實(shí)參為指針變量,形參為數(shù)組名。
18、f ( int x, int n ) p指向數(shù)組指向數(shù)組a,x和和a共用同一段內(nèi)存單元共用同一段內(nèi)存單元. main() int a10, *p; p = a; f ( p, 10 ); . m a i n ( ) int a10, *p; p = a; f( p, 10 ); 例例. 用實(shí)參指針變量將用實(shí)參指針變量將a數(shù)組中數(shù)組中n 個(gè)整數(shù)按相反順序存放個(gè)整數(shù)按相反順序存放.(e6)main() int i, a10,*p=a; printf(“The original array: n ”); for( i=0; i10; i+,p+) *p=rand(); printf(“%8d”, *
19、p); printf(“n”); p=a; inv(p,10); printf(“n “n The array is : n”); for( p=a; pa+10; p+) printf(“%8d”, *p); void inv(int *x, int n) int *p, m, temp, *i, *j; m=(n-1)/2; i = x ; j = x + n - 1 ; p=x+m; for( ; i=p; i+, j- - ) temp=*i; *i = *j; *j =temp; return; 例例. 用選擇法對(duì)用選擇法對(duì)10個(gè)整數(shù)排序。個(gè)整數(shù)排序。(e7)sort(int x,i
20、nt n) int i, j, k, t; for( i=0; in-1; i+) k=i; for(j=i+1; jxk) k=j; if( k !=i) t = xi; xi = xk; xk = t; main() int *p, i, a10; p=a; for( i=0; i10; i+) *p+=rand()%1000; p=a; sort(p,10); for( p=a, i=0; i10; i+) printf(“%5d”,*p);p+; 在使用指針變量時(shí),有幾個(gè)問(wèn)題要注意:在使用指針變量時(shí),有幾個(gè)問(wèn)題要注意:1、指針變量可以實(shí)現(xiàn)使本身的值改變。、指針變量可以實(shí)現(xiàn)使本身的值改變
21、。 如:如: for(p=a; p(a+10); p+)2、要注意指針變量的當(dāng)前值。、要注意指針變量的當(dāng)前值。3、用指針變量、用指針變量p指向數(shù)組元素指向數(shù)組元素,可以指到數(shù)組以后的內(nèi)存單元可以指到數(shù)組以后的內(nèi)存單元. C編譯程序不作下標(biāo)越界檢查。編譯程序不作下標(biāo)越界檢查。4、注意指針變量的運(yùn)算。如果、注意指針變量的運(yùn)算。如果p指向數(shù)組指向數(shù)組a.則:則: p+ (或或 p+=1 ),使,使p指向下一元素指向下一元素a1。 *p+ 等價(jià)等價(jià)*(p+)。作用是先得到。作用是先得到p指向的變量的值指向的變量的值(即即*p) 然后再使然后再使p+1p。 *(p+)與與*(+p) 不同。前者為不同。前
22、者為a0,后者為,后者為a1 (*p)+表示表示p指向的元素值加指向的元素值加1,即,即 a0+ 如果如果p當(dāng)前指向當(dāng)前指向a數(shù)組中第數(shù)組中第i個(gè)元素,則:個(gè)元素,則: *(p- -)相當(dāng)于相當(dāng)于ai- -,先對(duì),先對(duì)p進(jìn)行進(jìn)行*運(yùn)算,再使運(yùn)算,再使p自減;自減; *(+ p)相當(dāng)于相當(dāng)于a+i,先使,先使p自加,再作自加,再作*運(yùn)算。運(yùn)算。 *(- - p)相當(dāng)于相當(dāng)于a- -i,先使,先使p自減,再作自減,再作*運(yùn)算。運(yùn)算。v二維數(shù)組的指針表示法二維數(shù)組的指針表示法 從前邊的應(yīng)用中可得出一維數(shù)組以下兩點(diǎn)結(jié)論:從前邊的應(yīng)用中可得出一維數(shù)組以下兩點(diǎn)結(jié)論: 數(shù)組名代表了該數(shù)組的起始地址,也就是第
23、一個(gè)元素的起始數(shù)組名代表了該數(shù)組的起始地址,也就是第一個(gè)元素的起始地址。地址。 數(shù)組中任何一個(gè)元素的地址,都可以用其數(shù)組名加上一個(gè)偏數(shù)組中任何一個(gè)元素的地址,都可以用其數(shù)組名加上一個(gè)偏移量來(lái)表示。移量來(lái)表示。 這兩點(diǎn)可推廣到二維乃至多維數(shù)組,因這兩點(diǎn)可推廣到二維乃至多維數(shù)組,因C語(yǔ)言用一維數(shù)組來(lái)語(yǔ)言用一維數(shù)組來(lái)解釋多維數(shù)組??梢园讯S數(shù)組的每一行解釋為一個(gè)一維數(shù)組,解釋多維數(shù)組。可以把二維數(shù)組的每一行解釋為一個(gè)一維數(shù)組,對(duì)二維數(shù)組對(duì)二維數(shù)組a來(lái)說(shuō),可把它看成是由下列元素組成的一維數(shù)組:來(lái)說(shuō),可把它看成是由下列元素組成的一維數(shù)組: a0,a1,a2,ai, 這里這里 ai 既是廣義一維數(shù)組既是廣
24、義一維數(shù)組 a 的一個(gè)元素,又是一個(gè)一維數(shù)的一個(gè)元素,又是一個(gè)一維數(shù)組組 ai 的名字,是指向的名字,是指向 ai 的起始元素的指針常量。的起始元素的指針常量。例例. 指向數(shù)組元素的指針變量指向數(shù)組元素的指針變量。(e8_0)main( ) static int a35=1,2,3,4,5,6,7,8,9,10,11,12,13,14,15; int *p; for (p=a; pa0+15;p + +) printf(“%d”,*p); printf (“n”); main( ) static int a35=1,2,3,4,5,6,7,8,9,10,11,12,13,14,15; int
25、*p,i; for (i=0;i3;i+) for (p=ai;pai+5;p+) printf(%8d,*p); printf (n); 運(yùn)行結(jié)果:運(yùn)行結(jié)果: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15運(yùn)行結(jié)果:2 3 4 57 8 9 10111 12 13 14 15對(duì)二維數(shù)組在使用指針變量時(shí),有幾個(gè)問(wèn)題要注意:對(duì)二維數(shù)組在使用指針變量時(shí),有幾個(gè)問(wèn)題要注意: l l ak+j 等價(jià)于等價(jià)于&akj,即,即k行第行第 j 個(gè)元素的地址。個(gè)元素的地址。 由此得到由此得到: *(ak+j) 等價(jià)于等價(jià)于akj; l l a0 與與 &a00 等價(jià);等
26、價(jià); l l a+k 與與 ak、&ak0 等價(jià),而等價(jià),而 a0+k 與與 &a0k 等價(jià);等價(jià); l l *(a+i) 可理解為可理解為 ai,故有如下等價(jià)關(guān)系:,故有如下等價(jià)關(guān)系: a+0 等價(jià)于等價(jià)于 a0、 a0+0、 &a00、 *(a+0) a+1 等價(jià)于等價(jià)于 a1、 a1+0、 &a10、 *(a+1) a+(i-1) 等價(jià)于等價(jià)于 ai-1、ai-1+0、 &ai-10、 *(a+i-1) l l *(a+k)與與*ak是不同的,前者相當(dāng)于是不同的,前者相當(dāng)于ak,是一個(gè)地址值;,是一個(gè)地址值;后者相當(dāng)于后者相當(dāng)于*(ak+0)或或*
27、&ak0,是數(shù)組元素,是數(shù)組元素ak0中存儲(chǔ)的值。中存儲(chǔ)的值。 l l 數(shù)組元素?cái)?shù)組元素akp就是就是*(ak+p),即,即*(*(a+k)+p)例例.有有M個(gè)同學(xué)考個(gè)同學(xué)考N門(mén)課門(mén)課,統(tǒng)計(jì)總平均分統(tǒng)計(jì)總平均分,并查詢(xún)第并查詢(xún)第k個(gè)同學(xué)的考試成績(jī)。個(gè)同學(xué)的考試成績(jī)。#include “stdio.h”#define M 3#define N 4main() int i, k, scoreMN, *p; float average(int *, int ); void search(int *, int ,int ); for(i=0;iM;i+) for(p=scorei;pscore
28、i+N;p+) *p=rand()%101; printf(“n average =%5.2fn”,average(score,M*N); printf(“n Input k:”); scanf(%d,&k); search(scorek-1,N,k);函數(shù)參考程序函數(shù)參考程序float average(int *p, int n) int *p_end=p+n; float sum=0.; while (pp_end) sum=sum+*p+; return sum/n;void search(int *p, int n, int k) int *p_end=p+n; printf(
29、print score of %dth student:n ,k); while(pp_end) printf(%5d , *p+); 字符串和字符指針字符串和字符指針 main() char s6; int i; strcpy(s,data1); for(i=0;i5;i+) printf(%c n,si);main() char *s; int i; s=data1; for(i=0;i5;i+) printf(%c n,*(s+i); 字符串由是一串字符且以字符串由是一串字符且以 0 0 字符為結(jié)束標(biāo)志。字符為結(jié)束標(biāo)志。 字符數(shù)組由若干元素組成字符數(shù)組由若干元素組成, ,每個(gè)元素放一個(gè)字
30、符;是一個(gè)字符串每個(gè)元素放一個(gè)字符;是一個(gè)字符串 指針變量中存放的是某個(gè)元素的存儲(chǔ)地址,字符指針指向的是指針變量中存放的是某個(gè)元素的存儲(chǔ)地址,字符指針指向的是字符元素的地址。字符元素的地址。 賦值方式賦值方式 char str =“Good Bye”; /* 給字符數(shù)組賦初值給字符數(shù)組賦初值 */ char *s= “Good Bye” ; /* 指針指針s 指向字符串常量的首地址指向字符串常量的首地址*/ 在執(zhí)行語(yǔ)句中在執(zhí)行語(yǔ)句中: str=“Good Bye”; 直接給字符數(shù)組整體賦值是不允許的直接給字符數(shù)組整體賦值是不允許的。 s=“Good Bye”; 把字符串常量的首地址直接給指針變
31、量是把字符串常量的首地址直接給指針變量是 允許的。允許的。 指針變量不同于其他變量,除了在定義時(shí)要注意它指向目標(biāo)指針變量不同于其他變量,除了在定義時(shí)要注意它指向目標(biāo)的數(shù)據(jù)類(lèi)型外;在應(yīng)用中也要注意細(xì)節(jié)問(wèn)題。如:的數(shù)據(jù)類(lèi)型外;在應(yīng)用中也要注意細(xì)節(jié)問(wèn)題。如: char str 80, *p ; scanf(“%s”,str); scanf (“%s”,p); /*是不允許的是不允許的,p沒(méi)有獲得指向目標(biāo)的地址,沒(méi)有獲得指向目標(biāo)的地址, 它是一個(gè)不確定的值。它是一個(gè)不確定的值。*/例例. 將字符串將字符串2和字符串和字符串3依序放入字符串依序放入字符串1中中(e10)#include stdio.hm
32、ain() char str150, str220=It is a string!; char str3=It is a c programming example; int i , j , k; strcpy(str1,str2); /* 將字符串將字符串2賦給字符串賦給字符串1 */ k=strlen(str1); /* 獲取字符串獲取字符串1的長(zhǎng)度的長(zhǎng)度 */ for (i=0; str3i!=0; i+) str1k+i=str3i; /* 將字符串將字符串3中的每個(gè)字符依序放入字符串中的每個(gè)字符依序放入字符串1 */ str1k+i=0; /* 加一個(gè)字符串結(jié)束符加一個(gè)字符串結(jié)束符
33、*/ puts(str1); /* 輸出字符串輸出字符串1 */用指針做上題:用指針做上題:#include stdio.hmain() char str150,str220=It is a c; char str3=programming example; char *p1=str1,*p2=str2; clrscr(); while(*p2) *p1+=*p2+; p2=str3; while(*p2) *p1+=*p2+; *p1=0; puts(str1); I:Itis ac/0programming:/0p1p2p2例例 。 求某一字符在另一字符串中出現(xiàn)的次數(shù)求某一字符在另一字符串
34、中出現(xiàn)的次數(shù)(e11)#include stdio.hmain() char *str, c; printf(n Enter a string :); gets(str); printf(n Enter a char :); c=getchar(); printf(n %c is found %d times. n,c,s_count(c,str); s_count(char c1,char *s) int count=0; while(*s) if (*s+=c1 ) count+; return (count); T h i si sab o o k .0使用系統(tǒng)提供的函數(shù)進(jìn)行處理使用系統(tǒng)
35、提供的函數(shù)進(jìn)行處理.#include stdio.h#include ctype.hmain() char *str, *p,c; int n=0; printf(n Enter a string :); gets(str); printf(n Enter a char :); c=getchar(); p=strchr(str,c); /* p 指向指向 c 首次出現(xiàn)的地方首次出現(xiàn)的地方*/ while(p) n+; p=strchr(p+1,c) ; printf(n %c is found %d times. n,c,n); T h isisab o o k0i例例 . 求某一字符串在另
36、一字符串中出現(xiàn)的次數(shù)求某一字符串在另一字符串中出現(xiàn)的次數(shù)#include stdio.hmain() char *str,*substr; printf(n Enter a string :); gets(str); printf(n Enter a sub-string :); gets(substr); printf(“n %s is found %d times.n”, substr, s_count(substr,str); int s_count(char *s1,char *s) int count=0,flag; char *subs, *str=s; while(*str) f
37、lag=1; for ( subs=s1; *str+=*subs; subs+) flag=0; if (!*(subs+1) count+ ; break; if (flag) str+; return count ; a h i s b a c a b aca 0strac0subs使用系統(tǒng)提供的函數(shù)進(jìn)行處理使用系統(tǒng)提供的函數(shù)進(jìn)行處理.#include stdio.h #include ctype.h main() char *str,*substr,*p; int count=0,len=0; printf(n Enter a string :); gets(str); printf(
38、n Enter a sub-string :); gets(substr); len=strlen(substr); /* 求子串的長(zhǎng)度求子串的長(zhǎng)度*/ p=strstr(str,substr); /*p指向子串在串中首次出現(xiàn)的位置指向子串在串中首次出現(xiàn)的位置*/ while(p) count+; p=strstr(p+len,substr); printf(n %s is found %d times.n, substr,count); th isisab o o koi s0example#include main() char *p1,*p2; int i,j,k=0; clrscr()
39、; printf(nInput str1:);gets(p1); printf(nInput str2:);gets(p2); for(i=0;*(p2+i);i+) /* while (*p2) while(*p2&*p2!=*p1) p2+; */ for(j=0;*(p1+j)=*(p2+i+j);j+) /*for(j=0;*(p1=j)=*p2;j+,p2+) */ if(!*(p1+j+1)k+;break; printf(n Count=%d,k);a sssm sssa ss0ss0p1p2指針數(shù)組指針數(shù)組Zhangsan0Lisi0w angw u0M aliu0Su
40、nfei0Lim ing00 1 2 3 4 5 6 7 8 9 10 11100010121024103610481060定義:定義: 類(lèi)型名類(lèi)型名 * 數(shù)組名數(shù)組名長(zhǎng)度長(zhǎng)度 指針數(shù)組是用來(lái)存放一組地址的。為什么需要指針數(shù)組?指針數(shù)組是用來(lái)存放一組地址的。為什么需要指針數(shù)組? 先看一下下邊字符串操作的例子:先看一下下邊字符串操作的例子: static char name512=“Zhang san”,”Li si”,”Wang wu”,”Ma liu”, ”Sun fei”, “Li ming” 上邊定義了如圖所示上邊定義了如圖所示的二維數(shù)組。若一個(gè)字的二維數(shù)組。若一個(gè)字符串的長(zhǎng)度比較長(zhǎng),則
41、符串的長(zhǎng)度比較長(zhǎng),則要求按此長(zhǎng)度定義,這要求按此長(zhǎng)度定義,這就會(huì)浪費(fèi)很多內(nèi)存單元。就會(huì)浪費(fèi)很多內(nèi)存單元。如右圖,不足如右圖,不足1212也要占也要占據(jù)據(jù)1212個(gè)字節(jié)。由前所述,個(gè)字節(jié)。由前所述,在初始話時(shí)可用指針變?cè)诔跏荚挄r(shí)可用指針變量替代量替代字符數(shù)組。字符數(shù)組。例例. . 先存儲(chǔ)一班學(xué)生的名字,從鍵盤(pán)上輸入一個(gè)學(xué)生的名字,先存儲(chǔ)一班學(xué)生的名字,從鍵盤(pán)上輸入一個(gè)學(xué)生的名字,看是否是該班學(xué)生??词欠袷窃摪鄬W(xué)生。#include stdio.h“#include ctype.h main()char *name6=Zhang san,Li si,Wang wu,Ma liu,Sun fei,L
42、i ming; char *p; int i, flag=0; printf(“Enter your name:”); gets(p); /*輸入名字輸入名字*/ for (i=0;i6;i+) if (strcmp(namei,p)=0) flag=1;break; puts(p); /*輸出名字輸出名字*/ if (flag) printf(“ is in this class.n); else printf(“ is not in this class.n); 例例. . 先存儲(chǔ)一班學(xué)生的名字,按字母順序排序:先存儲(chǔ)一班學(xué)生的名字,按字母順序排序:#include string.hmai
43、n()char *name6=Zhang-san,Li-si,Wang-wu,Ma- liu,Sun-fei,Li-ming; char *p; int i, j, k; for (i=0;i5;i+) for (k=i, j=i+1;j6;j+) if (strcmp(namek,namej)0) k=j; if (k!=i) p=namei;namei=namek;namek=p; clrscr(); for (i=0;i6;i+) puts(namei);輸入一個(gè)輸入一個(gè) 36 的二維整數(shù)數(shù)組的二維整數(shù)數(shù)組, 輸出其中最大值輸出其中最大值, 最小值及其下標(biāo)。最小值及其下標(biāo)。Void ma
44、x_min(int *p, int n) int *x, i; x=p0; for (i=0;i*p0) p0=x ; else if(*x*p1 ) p1=x; main () int a36=4,3,9,0,8,7,2,11,3,5,88,6,1,2,3,4,5,65,*p2; clrscr(); p0=p1=a; max_min(p,18); printf(n min=%d row=%d col=%d,*p1,(p1-a)/6,(p1-a)%6); printf(n max=%d row=%d col=%d,*p0,(p0-a)/6,(p0-a)%6);指針與函數(shù)指針與函數(shù)q 指針用作函
45、數(shù)的參數(shù)指針用作函數(shù)的參數(shù)q 返回值是指針的函數(shù)返回值是指針的函數(shù)q 指向函數(shù)的指針指向函數(shù)的指針v 指針用作函數(shù)的參數(shù)指針用作函數(shù)的參數(shù) 這種使用很普遍,應(yīng)該熟練掌握。前邊我們已多次使用,這種使用很普遍,應(yīng)該熟練掌握。前邊我們已多次使用,如數(shù)組名作為參數(shù)、變量的地址作為參數(shù)。下邊看一個(gè)例子:如數(shù)組名作為參數(shù)、變量的地址作為參數(shù)。下邊看一個(gè)例子:例例. 有有n個(gè)整數(shù),使其前面各數(shù)順序向后移個(gè)整數(shù),使其前面各數(shù)順序向后移m個(gè)位置,最后個(gè)位置,最后m個(gè)個(gè)數(shù)變成最前面數(shù)變成最前面m個(gè)數(shù),請(qǐng)編程實(shí)現(xiàn)。個(gè)數(shù),請(qǐng)編程實(shí)現(xiàn)。mn-m續(xù)續(xù)123456789101012345678991012345678891
46、0123456778910123456原始數(shù)據(jù)n=10 m=4作循環(huán)移動(dòng)4次1次次2次次3次次4次次程序程序main( ) int a10=1,2,3,4,5,6,7,8,9,10,n=10,m, *p; void move(int x ,int,int); /* 函數(shù)說(shuō)明函數(shù)說(shuō)明*/ printf(“Enter m=“); scanf(%d,&m); move(a , n , m) ; /* 函數(shù)調(diào)用函數(shù)調(diào)用*/ for (p=a;px ; pp-) *pp=*(pp-1) ; *x=end; /* 將將 end 放入數(shù)組第一個(gè)數(shù)位置放入數(shù)組第一個(gè)數(shù)位置*/ m-; if (m0)
47、move(x,n,m); /*遞歸調(diào)用遞歸調(diào)用*/v 返回值是指針的函數(shù)返回值是指針的函數(shù)例:產(chǎn)生例:產(chǎn)生100個(gè)個(gè)2000以?xún)?nèi)的隨機(jī)數(shù),以?xún)?nèi)的隨機(jī)數(shù),求出最小數(shù),并指明其位置。求出最小數(shù),并指明其位置。#include stdio.h#define N 100main() int aN,*p,i; int *min(int a,int ); for (i=0;iN;i+) ai=rand()%2000;printf(%5d,ai); p=min(a,N); printf(n min=%d locate=%d n,*p,p-a);int *min(int a,int n) int *p,i; p=a; for (i=0;i*
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 幼兒園指南音樂(lè)培訓(xùn)
- 暫停支付一切款項(xiàng)通知函
- 2025公司內(nèi)部培訓(xùn)合同
- 企業(yè)員工成長(zhǎng)培訓(xùn)
- 【七年級(jí)下冊(cè)地理中圖版】7.2.2 自然環(huán)境的保護(hù) 富有海島特色的外向型經(jīng)濟(jì) 同步練習(xí)
- 農(nóng)業(yè)行業(yè)助理的工作職責(zé)簡(jiǎn)述
- 運(yùn)輸物流行業(yè)行政后勤工作總結(jié)
- 建筑裝潢行業(yè)市場(chǎng)推廣總結(jié)
- 酒店行業(yè)銷(xiāo)售員工作總結(jié)
- 銀行工作總結(jié)風(fēng)險(xiǎn)管理分析
- 23-燃?xì)赓|(zhì)量檢測(cè)制度
- 新媒體論文開(kāi)題報(bào)告范文
- 《火災(zāi)調(diào)查 第2版》 課件全套 劉玲 第1-12章 緒論、詢(xún)問(wèn) -火災(zāi)物證鑒定
- 汽車(chē)修理廠管理方案
- 借用他人名義買(mǎi)車(chē)協(xié)議完整版
- (正式版)JBT 5300-2024 工業(yè)用閥門(mén)材料 選用指南
- 校園超市經(jīng)營(yíng)投標(biāo)方案(技術(shù)方案)
- 基于Web服務(wù)的辦公系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)的開(kāi)題報(bào)告
- 國(guó)企工程類(lèi)工作總結(jié)
- 電腦教室設(shè)計(jì)方案
- 計(jì)算機(jī)江蘇對(duì)口單招文化綜合理論試卷
評(píng)論
0/150
提交評(píng)論