版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、 實驗九實驗九 指針指針(一一) 實驗內容:實驗內容:4 實驗九實驗九 指針指針(二二) 實驗內容:實驗內容:4上機作業(yè)上機作業(yè)指針指針 指針是指針是C C語言的一個重要特色,是一種數據類型,指針的作用語言的一個重要特色,是一種數據類型,指針的作用是:是: 可對內存中各種不同數據結構的數據進行可對內存中各種不同數據結構的數據進行快速處理快速處理 為函數間各類數據的傳遞提供了簡捷便利的方法為函數間各類數據的傳遞提供了簡捷便利的方法 利用指針可以編制出簡潔明快、功能強和質量高的程序利用指針可以編制出簡潔明快、功能強和質量高的程序可以說沒掌握指針就沒有掌握可以說沒掌握指針就沒有掌握C的精華。的精華。
2、 本章將主要介紹以下內容本章將主要介紹以下內容: 指針變量的定義指針變量的定義 指針與數組指針與數組 指針數組指針數組 指針與函數指針與函數指針變量的定義指針變量的定義v 地址及訪問方式地址及訪問方式 變量的地址是指變量在存儲區(qū)變量的地址是指變量在存儲區(qū)域中的物理位置。訪問變量有兩種域中的物理位置。訪問變量有兩種方式:方式:直接訪問直接訪問 指通過變量名或地址直指通過變量名或地址直接訪問接訪問變量的變量的值值;間接訪問間接訪問 指把一個變量的地址指把一個變量的地址放在另一個變量中放在另一個變量中(稱地址變量稱地址變量)然然后通過先找出地址變量的值,再由后通過先找出地址變量的值,再由此地址找到最
3、終要訪問的變量值此地址找到最終要訪問的變量值v 指針與指針變量指針與指針變量 指針指針就是地址,一個變量的指針就是地址,一個變量的指針 : : 58 23 12 3 : :2000變量i變量j變量k變量m2000200220042006變量p就是指該變量的地址,存放地址的變量就是就是指該變量的地址,存放地址的變量就是指針變量指針變量。3500v指針變量的定義指針變量的定義 : : 10 20 : : 3000 3002abp1p230003002 : : 10 20 : : 3000 3000 它和普通變量一樣占用一定的存儲空間,但指針變量的存它和普通變量一樣占用一定的存儲空間,但指針變量的存
4、儲空間中存放的不是普通的數據,而是一個地址,因此儲空間中存放的不是普通的數據,而是一個地址,因此指針變指針變量是一個地址變量量是一個地址變量。存儲類型存儲類型 數據數據類型類型 * *標識符標識符例例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 ); 結果為:結果為: 10, 20 10, 10注意:注意: 在變量說明中:在變量說明中:標識名前的標識名前的 * * 號僅是一個符號,
5、表號僅是一個符號,表示其后是一個指針變量名;數據類型并不是指針變量示其后是一個指針變量名;數據類型并不是指針變量本身的數據類型,而是指針指向其目標的數據類型。本身的數據類型,而是指針指向其目標的數據類型。 指針運算符:指針運算符: & 獲取運算量的地址獲取運算量的地址 。如:。如: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 指針變量用作函數參量指針變量用作函數參量(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假設已執(zhí)行假設已執(zhí)行 p=&a; 1、&*p含義是什么?含義是什么? 先進行先進行*p運算運算,得得a的值的值,再進行再進行&運算運算, &*p 與與 &a 相同,即變量相同,即變量a的地址。的地址。 2、*&a的含義是什么
8、?的含義是什么? 先進行先進行&a運算,得運算,得a的地址,再進行的地址,再進行*運算。運算。 *&a、*p及變量及變量a等價。等價。 3、(*p) + + 相當于相當于a + +。 它與它與*p + + 不同。不同。 4、*p + + 等價于等價于*(p + +),即先進行,即先進行*運算,得到運算,得到 a 的值,然后執(zhí)行的值,然后執(zhí)行p+,這樣,這樣 p 不再指向不再指向a了。了。 關于關于&和和*運算符的說明:運算符的說明:指針僅能進行加、減算術運算如:指針僅能進行加、減算術運算如: p+n,p-n,p+,p-,+p,-p, p-= n, p+= n,p1-p2
9、 等。等。 其中其中 n 是整數,是整數,p、p1、p2 均為指針;均為指針; 施行加法運算時,指針向地址增大的方向移動;施行加法運算時,指針向地址增大的方向移動; 施行減法運算時,指針向地址減小的方向移動;施行減法運算時,指針向地址減小的方向移動; 移動長度取決于指針的基類型,由計算機決定移動長度取決于指針的基類型,由計算機決定;v 指針的關系運算指針的關系運算 設指針設指針p1,p2指向同一數組中的元素,則:指向同一數組中的元素,則: p1、=、=、!=比較的意義;比較的意義; 允許將指針與允許將指針與NULL或數值或數值 0 進行進行 =或或 != 的比較,以便判的比較,以便判定一個指針
10、是否為空指針。定一個指針是否為空指針。注意:注意: 不可將指針與其他類型的對象作比較;不可將指針與其他類型的對象作比較; 若兩指針指向不同數組中的元素,也不可比較;若兩指針指向不同數組中的元素,也不可比較; v 指針的算術運算指針的算術運算指針與數組指針與數組 v 一維數組的指針表示方法一維數組的指針表示方法 C C語言規(guī)定數組名代表數組的首地址。語言規(guī)定數組名代表數組的首地址。如:如: int a10 , *p; 則則 : : p=&a0; 和和 p=a;兩語句等價兩語句等價, ,其作用是把其作用是把 a 數組首地址賦給指針變量數組首地址賦給指針變量 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 引用數組方式:引用數組方式: i=0 9; 因此因此ai等價于等價于: * (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 );輸出數組中的全部元素輸出數組中的全部元素的值。使用下標法、利用數組名計算地的值。使用
13、下標法、利用數組名計算地址,找出元素的值、用指針變量指向數組元素。址,找出元素的值、用指針變量指向數組元素。(e3)比較一下:比較一下:用下標法比較直觀;使用指針效率高。用下標法比較直觀;使用指針效率高。v 數組名作函數參數數組名作函數參數 用數組名作實參,在調用函數時是把數組的首地用數組名作實參,在調用函數時是把數組的首地址傳送給形參。即實參數組與形參數組共占同一段內址傳送給形參。即實參數組與形參數組共占同一段內存。存。例例. 將數組將數組a中的中的n個整數按相反順序存放。個整數按相反順序存放。(e4) 分析:分析:將將a0與與an-1對換,再將對換,再將a1和和an-2對對換換。設。設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個數中找出其中最大值和最小值。個數中找出其中最大值和最小值。(e5) int max,min; void max_min_value(int a, int n) int *p,*a_end; a_end=a+n; max=min=*a; /* 等價等價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); 主函數主函數如果有一個實參數組,想在函數中改變此數組的元素的值,實參與如果有一個實參數組,想在函數中改變此數組的元素的值,實參與形參的對應關系有以下形參的
17、對應關系有以下4種情況:種情況:1、形參和實參都用數組名、形參和實參都用數組名f ( int x,int n ) a和和x指的是同一個數組指的是同一個數組 2、實參用數組名,形參用指針變量、實參用數組名,形參用指針變量f( int *x, int n ) 開始時,開始時,x指向指向a0main() inta10; f(a,10); main() int a10; f( a, 10 ); 3 、實參形參都用指針變量、實參形參都用指針變量 f ( int *x, int n ) . 實參實參p和形參和形參x都指向數組都指向數組a 4、實參為指針變量,形參為數組名。、實參為指針變量,形參為數組名。
18、f ( int x, int n ) p指向數組指向數組a,x和和a共用同一段內存單元共用同一段內存單元. main() int a10, *p; p = a; f ( p, 10 ); . m a i n ( ) int a10, *p; p = a; f( p, 10 ); 例例. 用實參指針變量將用實參指針變量將a數組中數組中n 個整數按相反順序存放個整數按相反順序存放.(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; 例例. 用選擇法對用選擇法對10個整數排序。個整數排序。(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+; 在使用指針變量時,有幾個問題要注意:在使用指針變量時,有幾個問題要注意:1、指針變量可以實現(xiàn)使本身的值改變。、指針變量可以實現(xiàn)使本身的值改變
21、。 如:如: for(p=a; p(a+10); p+)2、要注意指針變量的當前值。、要注意指針變量的當前值。3、用指針變量、用指針變量p指向數組元素指向數組元素,可以指到數組以后的內存單元可以指到數組以后的內存單元. C編譯程序不作下標越界檢查。編譯程序不作下標越界檢查。4、注意指針變量的運算。如果、注意指針變量的運算。如果p指向數組指向數組a.則:則: p+ (或或 p+=1 ),使,使p指向下一元素指向下一元素a1。 *p+ 等價等價*(p+)。作用是先得到。作用是先得到p指向的變量的值指向的變量的值(即即*p) 然后再使然后再使p+1p。 *(p+)與與*(+p) 不同。前者為不同。前
22、者為a0,后者為,后者為a1 (*p)+表示表示p指向的元素值加指向的元素值加1,即,即 a0+ 如果如果p當前指向當前指向a數組中第數組中第i個元素,則:個元素,則: *(p- -)相當于相當于ai- -,先對,先對p進行進行*運算,再使運算,再使p自減;自減; *(+ p)相當于相當于a+i,先使,先使p自加,再作自加,再作*運算。運算。 *(- - p)相當于相當于a- -i,先使,先使p自減,再作自減,再作*運算。運算。v二維數組的指針表示法二維數組的指針表示法 從前邊的應用中可得出一維數組以下兩點結論:從前邊的應用中可得出一維數組以下兩點結論: 數組名代表了該數組的起始地址,也就是第
23、一個元素的起始數組名代表了該數組的起始地址,也就是第一個元素的起始地址。地址。 數組中任何一個元素的地址,都可以用其數組名加上一個偏數組中任何一個元素的地址,都可以用其數組名加上一個偏移量來表示。移量來表示。 這兩點可推廣到二維乃至多維數組,因這兩點可推廣到二維乃至多維數組,因C語言用一維數組來語言用一維數組來解釋多維數組??梢园讯S數組的每一行解釋為一個一維數組,解釋多維數組??梢园讯S數組的每一行解釋為一個一維數組,對二維數組對二維數組a來說,可把它看成是由下列元素組成的一維數組:來說,可把它看成是由下列元素組成的一維數組: a0,a1,a2,ai, 這里這里 ai 既是廣義一維數組既是廣
24、義一維數組 a 的一個元素,又是一個一維數的一個元素,又是一個一維數組組 ai 的名字,是指向的名字,是指向 ai 的起始元素的指針常量。的起始元素的指針常量。例例. 指向數組元素的指針變量指向數組元素的指針變量。(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); 運行結果:運行結果: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15運行結果:2 3 4 57 8 9 10111 12 13 14 15對二維數組在使用指針變量時,有幾個問題要注意:對二維數組在使用指針變量時,有幾個問題要注意: l l ak+j 等價于等價于&akj,即,即k行第行第 j 個元素的地址。個元素的地址。 由此得到由此得到: *(ak+j) 等價于等價于akj; l l a0 與與 &a00 等價;等
26、價; l l a+k 與與 ak、&ak0 等價,而等價,而 a0+k 與與 &a0k 等價;等價; l l *(a+i) 可理解為可理解為 ai,故有如下等價關系:,故有如下等價關系: a+0 等價于等價于 a0、 a0+0、 &a00、 *(a+0) a+1 等價于等價于 a1、 a1+0、 &a10、 *(a+1) a+(i-1) 等價于等價于 ai-1、ai-1+0、 &ai-10、 *(a+i-1) l l *(a+k)與與*ak是不同的,前者相當于是不同的,前者相當于ak,是一個地址值;,是一個地址值;后者相當于后者相當于*(ak+0)或或*
27、&ak0,是數組元素,是數組元素ak0中存儲的值。中存儲的值。 l l 數組元素數組元素akp就是就是*(ak+p),即,即*(*(a+k)+p)例例.有有M個同學考個同學考N門課門課,統(tǒng)計總平均分統(tǒng)計總平均分,并查詢第并查詢第k個同學的考試成績。個同學的考試成績。#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);函數參考程序函數參考程序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 字符為結束標志。字符為結束標志。 字符數組由若干元素組成字符數組由若干元素組成, ,每個元素放一個字
30、符;是一個字符串每個元素放一個字符;是一個字符串 指針變量中存放的是某個元素的存儲地址,字符指針指向的是指針變量中存放的是某個元素的存儲地址,字符指針指向的是字符元素的地址。字符元素的地址。 賦值方式賦值方式 char str =“Good Bye”; /* 給字符數組賦初值給字符數組賦初值 */ char *s= “Good Bye” ; /* 指針指針s 指向字符串常量的首地址指向字符串常量的首地址*/ 在執(zhí)行語句中在執(zhí)行語句中: str=“Good Bye”; 直接給字符數組整體賦值是不允許的直接給字符數組整體賦值是不允許的。 s=“Good Bye”; 把字符串常量的首地址直接給指針變
31、量是把字符串常量的首地址直接給指針變量是 允許的。允許的。 指針變量不同于其他變量,除了在定義時要注意它指向目標指針變量不同于其他變量,除了在定義時要注意它指向目標的數據類型外;在應用中也要注意細節(jié)問題。如:的數據類型外;在應用中也要注意細節(jié)問題。如: char str 80, *p ; scanf(“%s”,str); scanf (“%s”,p); /*是不允許的是不允許的,p沒有獲得指向目標的地址,沒有獲得指向目標的地址, 它是一個不確定的值。它是一個不確定的值。*/例例. 將字符串將字符串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的長度的長度 */ for (i=0; str3i!=0; i+) str1k+i=str3i; /* 將字符串將字符串3中的每個字符依序放入字符串中的每個字符依序放入字符串1 */ str1k+i=0; /* 加一個字符串結束符加一個字符串結束符
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)的次數求某一字符在另一字符串
34、中出現(xiàn)的次數(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)提供的函數進行處理使用系統(tǒng)
35、提供的函數進行處理.#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)的次數求某一字符串在另一字符串中出現(xiàn)的次數#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)提供的函數進行處理使用系統(tǒng)提供的函數進行處理.#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); /* 求子串的長度求子串的長度*/ 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指針數組指針數組Zhangsan0Lisi0w angw u0M aliu0Su
40、nfei0Lim ing00 1 2 3 4 5 6 7 8 9 10 11100010121024103610481060定義:定義: 類型名類型名 * 數組名數組名長度長度 指針數組是用來存放一組地址的。為什么需要指針數組?指針數組是用來存放一組地址的。為什么需要指針數組? 先看一下下邊字符串操作的例子:先看一下下邊字符串操作的例子: static char name512=“Zhang san”,”Li si”,”Wang wu”,”Ma liu”, ”Sun fei”, “Li ming” 上邊定義了如圖所示上邊定義了如圖所示的二維數組。若一個字的二維數組。若一個字符串的長度比較長,則
41、符串的長度比較長,則要求按此長度定義,這要求按此長度定義,這就會浪費很多內存單元。就會浪費很多內存單元。如右圖,不足如右圖,不足1212也要占也要占據據1212個字節(jié)。由前所述,個字節(jié)。由前所述,在初始話時可用指針變在初始話時可用指針變量替代量替代字符數組。字符數組。例例. . 先存儲一班學生的名字,從鍵盤上輸入一個學生的名字,先存儲一班學生的名字,從鍵盤上輸入一個學生的名字,看是否是該班學生??词欠袷窃摪鄬W生。#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); 例例. . 先存儲一班學生的名字,按字母順序排序:先存儲一班學生的名字,按字母順序排序:#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);輸入一個輸入一個 36 的二維整數數組的二維整數數組, 輸出其中最大值輸出其中最大值, 最小值及其下標。最小值及其下標。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);指針與函數指針與函數q 指針用作函
45、數的參數指針用作函數的參數q 返回值是指針的函數返回值是指針的函數q 指向函數的指針指向函數的指針v 指針用作函數的參數指針用作函數的參數 這種使用很普遍,應該熟練掌握。前邊我們已多次使用,這種使用很普遍,應該熟練掌握。前邊我們已多次使用,如數組名作為參數、變量的地址作為參數。下邊看一個例子:如數組名作為參數、變量的地址作為參數。下邊看一個例子:例例. 有有n個整數,使其前面各數順序向后移個整數,使其前面各數順序向后移m個位置,最后個位置,最后m個個數變成最前面數變成最前面m個數,請編程實現(xiàn)。個數,請編程實現(xiàn)。mn-m續(xù)續(xù)123456789101012345678991012345678891
46、0123456778910123456原始數據n=10 m=4作循環(huán)移動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); /* 函數說明函數說明*/ printf(“Enter m=“); scanf(%d,&m); move(a , n , m) ; /* 函數調用函數調用*/ for (p=a;px ; pp-) *pp=*(pp-1) ; *x=end; /* 將將 end 放入數組第一個數位置放入數組第一個數位置*/ m-; if (m0)
47、move(x,n,m); /*遞歸調用遞歸調用*/v 返回值是指針的函數返回值是指針的函數例:產生例:產生100個個2000以內的隨機數,以內的隨機數,求出最小數,并指明其位置。求出最小數,并指明其位置。#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. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 氣浮設備行業(yè)相關投資計劃提議范本
- 2025中國旅游集團崗位公開招聘20人高頻重點提升(共500題)附帶答案詳解
- 2025中國南水北調集團江漢水網建設開發(fā)限公司春季公開招聘【15人】高頻重點提升(共500題)附帶答案詳解
- 2025中國人民財產保險股份限公司嘉興市分公司招聘29人高頻重點提升(共500題)附帶答案詳解
- 2025下半年陜西省省屬事業(yè)單位聯(lián)考招聘377人高頻重點提升(共500題)附帶答案詳解
- 2025下半年廣東佛山市南海區(qū)糧油儲備限公司招聘3人高頻重點提升(共500題)附帶答案詳解
- 2025下半年四川省瀘州市古藺縣事業(yè)單位招聘86人歷年高頻重點提升(共500題)附帶答案詳解
- 2025上半年江蘇省揚州廣陵事業(yè)單位招聘141人歷年高頻重點提升(共500題)附帶答案詳解
- 2025上半年四川省雅安市考試招聘綜合類事業(yè)單位人員418人高頻重點提升(共500題)附帶答案詳解
- 2025上半年四川南充市高坪區(qū)招聘事業(yè)單位工作人員48人歷年高頻重點提升(共500題)附帶答案詳解
- 嬰幼兒認知發(fā)展與指導學習通超星期末考試答案章節(jié)答案2024年
- 2024年居間服務合同:律師事務所合作與業(yè)務推廣
- 消防設備施工方案
- DB43-T+3015-2014《校園食材配送服務規(guī)范》
- 安全生產專(兼)職管理人員職責
- 公檢法聯(lián)席會議制度
- 成都大學《Python數據分析》2022-2023學年期末試卷
- 上海市市轄區(qū)(2024年-2025年小學五年級語文)部編版期末考試(上學期)試卷及答案
- 期末試卷(試題)-2024-2025學年五年級上冊數學人教版
- 護理安全警示教育-新-
- 社會工作行政復習要點
評論
0/150
提交評論