C程序设计英文课件:CHAPTE 5 Pointer and Arrays

上传人:工**** 文档编号:584144704 上传时间:2024-08-30 格式:PPT 页数:98 大小:1.70MB
返回 下载 相关 举报
C程序设计英文课件:CHAPTE 5 Pointer and Arrays_第1页
第1页 / 共98页
C程序设计英文课件:CHAPTE 5 Pointer and Arrays_第2页
第2页 / 共98页
C程序设计英文课件:CHAPTE 5 Pointer and Arrays_第3页
第3页 / 共98页
C程序设计英文课件:CHAPTE 5 Pointer and Arrays_第4页
第4页 / 共98页
C程序设计英文课件:CHAPTE 5 Pointer and Arrays_第5页
第5页 / 共98页
点击查看更多>>
资源描述

《C程序设计英文课件:CHAPTE 5 Pointer and Arrays》由会员分享,可在线阅读,更多相关《C程序设计英文课件:CHAPTE 5 Pointer and Arrays(98页珍藏版)》请在金锄头文库上搜索。

1、Data Type of C5.1 Pointer and Address5.2 Pointer and Function Arguments5.3 Pointers and Arrays5.4 Address Arithmetic5.5 Character Pointers and Functions5.6 Pointer Arrays; Pointers to Pointers5.7 Multi_dimensional Arrays5.8 Initialization of Pointer Arrays5.9 Pointers vs. Multi-dimensional Arrays5.1

2、0 Command-line Arguments5.11 Pointers to Functions5.12 Complicated DeclarationsContents 1.内存地址内存地址内存中存储单元的编号内存中存储单元的编号 计算机硬件系统的内存储器中,拥有大量的存储单元 (容量为字节)。为了方便管理,必须为每一个存储 单元编号,这个编号就是存储单元的“地址”。每个存储 单元都有一个唯一的地址(指针)。5.1 Pointers and Addressescharintlong or float20003000 300140004003地址地址2.变量地址变量地址系统分配给变量的内存

3、单元的系统分配给变量的内存单元的起始起始地址地址3.变量值的存取变量值的存取通过变量在内存中的地址进行通过变量在内存中的地址进行5.1 Pointers and Addresses main( ) int num; scanf(%d,&num); /*input 3*/ printf(num=%dn, num); 假设系统分配给变量假设系统分配给变量num的的2字节存储单元为字节存储单元为 3000 和和3001,则起始地址,则起始地址3000就是变量就是变量num在内存中的地址。在内存中的地址。00 03numx3000 3001400040035.1 Pointers and Addres

4、sesNote:内存单元的地址与内存单元中的数据是两个完全不同的概念。内存单元的地址与内存单元中的数据是两个完全不同的概念。5.1 Pointers and Addressesi200020022004addresscontentjk1012325直接访问直接访问直接利用变量的地址进行存取直接利用变量的地址进行存取 1)上例中scanf(“%d”,&num)的执行过程是这样的: 用变量名num作为索引值,找到变量num的起始地址3000;然后将键盘输入的值(设为)送到内存单元3000和3001中。 2)printf(“num=%dn”,num)的执行过程,与scanf()很相似:首先找到变量n

5、um的起始地址3000,然后从3000和3001中取出其值,最后将它输出。 5.1 Pointers and Addressesnum30003AA5.1 Pointers and AddressesBBA将将A钥匙放到钥匙放到B中锁起来。中锁起来。AAAAB如果需要将物品放入如果需要将物品放入A中,就需要先找出中,就需要先找出B钥匙,打开钥匙,打开B,取出,取出A钥匙,再打开钥匙,再打开A,将,将物品放入。物品放入。间接访问间接访问通过另一变量访问该变量的值通过另一变量访问该变量的值 语言规定:在程序中可以定义一种特殊的变量(称为指针变量),用来存放其它变量的地址。5.1 Pointers

6、and AddressesExample:p_num=#/*&是一元运算符,用于取一个对象的地址是一元运算符,用于取一个对象的地址*/这时这时p_numde 值是值是3000,假设存放,假设存放p_num的地址是的地址是4000.num30003p_num30004000通过指针访问数据的过程:首先找到指针变量p_num的地址(4000),取出其值3000(正好是变量num 的起始地址);然后将键盘输入的值(设为)送到内存单元3000和3001中。Definition of pointer variablesyntax: type *name 类型说明符类型说明符 * *指针变量名指针

7、变量名int *p2; float *p3;Char *p45.1 Pointers and AddressesDefinition of pointer variable5.1 Pointers and Addressesi200020022004addressjk10123252000Address valuepointerPointer variable5.1 Pointers and Addressesint i,j; int *point_i, *point_j;point_i=&i; point_j=&j;iPoint_ijPoint_jNote: 1)Pointer variab

8、le has same type with the variable which pointed to. 指针的数据类型应与被指向的变量的数据类型相同指针的数据类型应与被指向的变量的数据类型相同。Note:2)指针变量同普通变量一样,使用之前不仅要定义说明,指针变量同普通变量一样,使用之前不仅要定义说明,而且必须赋予具体的值。而且必须赋予具体的值。 3)指针变量存放的是其他变量的地址,指针变量存放的是其他变量的地址,不要试图直接对不要试图直接对指针变量赋值。指针变量赋值。int *p;int c;c=200;p=&c;p=100;5.1 Pointers and AddressesVariab

9、les pointer is the variables address;Pointer variable points to the variable;Variables pointer vs. Pointer variable (1)变量的指针变量的指针即地址 一个变量的地址称为该变量的指针。通过变量的指针能够找到该变量。(2)指针变量指针变量专门用于存储其它变量地址的变量5.1 Pointers and Addressesi200020022004addressjk10123252000Address valuepointerPointer variable& Address Opera

10、tor(地址运算符地址运算符)&a : as address;p=&c; /* p point to c */* Indirection operator (dereferencing operator) (指针运算符或间接访问运算符)(指针运算符或间接访问运算符) 5.1 Pointers and Addresses*p : the variable which p point to (指针变量所指向的变量)指针变量所指向的变量)v=*p; /* get the value which p point to*/指针变量和它指向的变量之间的关系用指针运算符指针变量和它指向的变量之间的关系用指针

11、运算符“*”表示。表示。 * * 表示指向表示指向 p_num=# /*p_num get the address of the variable num */num=3; /*variable num get the value 3 */*p_num=3; /*the variable which p_num point to get the value 3*/Variables pointer vs. Pointer variable 5.1 Pointers and Addressesnum30003p_num3000& and * Same precedence, associ

12、ate right to left.int *dp_c;dp_c=&c;dp_c=&c;*dp_c=3;dp_c&c*dp_ccdp_c point to cthe variable which dp_c point to5.1 Pointers and AddressesExample:Example:int x=1,y=2,z10;int *ip;ip=&x;/* ip point to x*/y=*ip;/* y=x; that is y=1;*/*ip=0;/* x=0 */ip=&z0;/* ip point to z0*/5.1 Pointers and AddressesExam

13、ple:*dp=*dp+1;y=*dp+1;*dp+=1;+*dp;(*dp)+;5.1 Pointers and AddressesExample:p_num=#&num numnum+&*p_num *&num(*p_num)+5.1 Pointers and AddressesExample:main() int i,j,*p; p=&i; printf(“%xn”,p);/*以以16进制形式输出进制形式输出*/ p=&j; printf(“%xn”,p); *p=100; printf(“%dn”,j); i=*p; printf(“%dn”,i);5.1 Pointers a

14、nd Addresses5.1 Pointers and Addressesoutput: ffda ffdc 100 100jip&i100100 p=&i; printf(“%xn”,p p=&j; printf(“%xn”,p); *p=100; printf(“%dn”,j); i=*p; printf(“%dn”,i);21Example:main() int i,j,*p1,*p2; p1=&i; p2=&j; i=100; *p2=*p1; printf(“%d,%dn”,i,j);5.1 Pointers and Addresses5.1 Pointers and Addres

15、sesoutput: 100,100 p1=&i; p2=&j; i=100; *p2=*p1jip1&i10010021&jp2Example:main() int i=100, int *p1,*p2; p1=&i; p2=p1; printf(“%x,%xn”,p1,p2);5.1 Pointers and Addresses5.1 Pointers and Addressesoutput: ffdc,ffdc p1=&i; p2=p1; ip1&i10021&ip2Example:main() int a=100, int *p=&a; /*int *p; p=&a;*/ printf

16、(“%x,%dn”,&a,*p); printf(“%x,%dn”,p,a); printf(“%x,%dn”,&*p,*&a);5.1 Pointers and Addresses5.1 Pointers and Addressesoutput: ffdc,100 ffdc,100 ffdc,100 printf(“%x,%dn”,&a,*p); printf(“%x,%dn”,p,a); printf(“%x,%dn”,&*p,*&a);ap&a100Example:输入输入a和和b两个整数,按先大后两个整数,按先大后小的顺序输出。小的顺序输出。main() int *p1,*p2,*p,

17、a,b; scanf(%d,%d,&a,&b); p1=&a;p2=&b; if(ab) p=p1;p1=p2;p2=p; printf(na=%d,b=%dn,a,b); printf(max=%d,min=%dn,*p1, *p2);5.1 Pointers and Addresses&a5&b19abp1p2&b5&a19abp2p1output: a=5,b=19 max=19,min=5 exchange(int *q1,int *q2,int *q3) if(*q1*q2) swap(q1,q2); if(*q1*q3) swap(q1,q3); if(*q2*q3) swap(q

18、2,q3); Summarization:1)1)指针运算符指针运算符取地址运算符取地址运算符&:&:单目运算符;其结合性为自右至左,其功能是取变量的地址。单目运算符;其结合性为自右至左,其功能是取变量的地址。指针运算符指针运算符* *: :单目运算符;其结合性为自右至左;用来表示指针变量所指的变量;在单目运算符;其结合性为自右至左;用来表示指针变量所指的变量;在* *运运算符之后跟的变量必须是指针变量。算符之后跟的变量必须是指针变量。2)2)赋值运算赋值运算把一个变量的地址赋予指向相同数据类型的指针变量。把一个变量的地址赋予指向相同数据类型的指针变量。 例如:例如:int a,*pa;pa=

19、&a; /*把整型变量把整型变量a的地址赋予整型指针变量的地址赋予整型指针变量pa*/把一个指针变量的值赋予指向相同类型变量的另一个指针变量。把一个指针变量的值赋予指向相同类型变量的另一个指针变量。 如:如: int a,*pa=&a,*pb; pb=pa; /*把把a的地址赋予指针变量的地址赋予指针变量pb*/5.1 Pointers and AddressesPointers can be functions argumentsData communication Address communicationPointer arguments enable a function to acc

20、ess and change object in the function that called it. 指针变量作实参时,与普通变量一样,也是指针变量作实参时,与普通变量一样,也是“值传递值传递”,即,即将指针变量的值(一个地址)传递给被调用函数的形参(必将指针变量的值(一个地址)传递给被调用函数的形参(必须是一个指针变量)。须是一个指针变量)。5.2 Pointers and Function Argumentsvoid swap(int *px,int *py) int temp; temp=*px; *px=*py; *py=temp;main() void swap(int *,i

21、nt *); int a=10,b=20; printf(“%d,%dn”,a,b); swap(&a,&b); printf(“%d,%dn”,a,b);5.2 Pointers and Function Arguments&a10&b20ab&a10&aapx&b20&bbpy5.1 Pointers and Addresses&a20&b10ab&a20&aapx&b10&bbpyvoid swap(int *px,int *py) int temp; temp=*px; *px=*py; *py=temp;output: 10,20 20,10 思考思考1:请找出下列程序段的错:请找出

22、下列程序段的错误:误:Void swap(int *p1,int *p2) int *temp; *temp=*p1; *p1=*p2; *p2=*temp;5.2 Pointers and Function Arguments思考2:在主函数中用swap(a,b) 调用下面的函数能否实现实现a和b互换。swap(int x,int y)int temp; temp=x; x=y; y=temp;5.2 Pointers and Function Arguments10102020abxy10202010abxy思考思考3:能否通过下面的方法交换:能否通过下面的方法交换a,b和值?和值?voi

23、d swap(int *px,int *py) int *temp; temp=px; px=py; py=temp;5.2 Pointers and Function Argumentsmain() void swap(int *,int *); int a=10,b=20; printf(“%d,%dn”,a,b); swap(&a,&b); printf(%d,%dn”,a,b);5.1 Pointers and Addresses&a10&b20ab&a10&aapx&b20&bbpy5.1 Pointers and Addresses10&bapx20&apy&a10&b20abvo

24、id swap(int *px,int *py) int *temp; temp=px; px=py; py=temp;例:输入a、b、c, 3个整数,按大小顺序输出。swap(int *pt1,int *pt2)int temp; temp=*pt1; *pt1=*pt2; *pt2=temp;exchange(int *q1,int *q2,int *q3) if(*q1*q2) swap(q1,q2); if(*q1*q3) swap(q1,q3); if(*q2*q3) swap(q2,q3);main() int a,b,c; scanf(%d,%d,%d,&a,&b,&c); ex

25、change(&a,&b,&c); printf(n%d,%d,%d n,a,b,c); 5.2 Pointers and Function Argumentssyntax:type array_nameconstant expressionExample:float sum2+5;int a5;a:5.3 Pointers and ArraysArrays name point to the first elements.数组数组名代表数组在内存中的起始地址,与第名代表数组在内存中的起始地址,与第0个元素的地个元素的地址相同址相同.a&a0a0a1a2a3a4pa=a; pa=&a0;int

26、 a5;int a5;int *pa;int *pa;5.3 Pointers and Arraysa0 a1 a2 a3 a4a:papa=&a2; a0 a1 a2 a3 a4a:pa数组的指针数组的指针数组第一个元素在内存中的起始地址,数组第一个元素在内存中的起始地址,数组元素的指针数组元素的指针数组元素在内存中的起始地址数组元素在内存中的起始地址int *pa; pa=&a0;pa+1 a1;pa+i ai;x=*(pa+1);x=a1;Note: pa+1 points to the next element after pa, pa+i points to the i-th ele

27、ment after pa.pa+1指向数组的下一个元素,而不是简单地使指针变量指向数组的下一个元素,而不是简单地使指针变量pa的值的值+1。其实际变化为。其实际变化为pa+1*size(size为一个元素占用的字节数)。为一个元素占用的字节数)。5.3 Pointers and Arraysa0 a1 a2 a3 a4a:aian-3 an-2 an-1papa+1pa+ipa+2pa+n-12000200220045.3 Pointers and ArraysSummarization:如果如果p的初值为的初值为&a0,则则1)p+i和和a+i就是就是ai的地址,或者说它们指向的地址,或者

28、说它们指向a数组的第数组的第i个元素。个元素。5.3 Pointers and Arrays2)*(p+i)或或*(a+i)就是就是p+i或或a+i所指向的数组元素,即所指向的数组元素,即ai。 3)指向数组的指针变量也可以带下标,如指向数组的指针变量也可以带下标,如pi与与*(p+i)等价。等价。&aia+i ai*(a+i)pa=a; pa=&a0;pa+i&pai *(pa+i)paiUse array nameUse pointer&aiai5.3 Pointers and Arrays5.3 Pointers and ArraysExample:输出数组中的全部元素。(下标法)mai

29、n() int a10,i; for(i=0;i10;i+) ai=i; for(i=0;i10;i+) printf(a%d=%dn,i,ai);输出数组中的全部元素。(通过数组名计算元素的地址)main() int a10,i; for(i=0;i10;i+) *(a+i)=i; for(i=0;i10;i+) printf(a%d=%dn,i,*(a+i);5.3 Pointers and ArraysExample:输出数组中的全部元素。(用指针变量指向数组元素)main()int a10,i,*p;p=a;for(i=0;i10;i+)*(p+i)=i;for(i=0;i10;i+)

30、printf(a%d=%dn,i,*(p+i);或者main()int a10,i,*p=a;for(i=0;i10;) *p=i; printf(a%d=%dn,i+,*p+); A pointer is a variable, so pa=a and pa+ are legal; 指针是变量指针是变量,其值可以改变。其值可以改变。An array name is not a variable, 数组名不是变量数组名不是变量,其值不可以改变其值不可以改变Note:a=pa a+5.3 Pointers and ArraysWhen an array name is passed to a f

31、unction, what is passed is the location of the initial element.5.3 Pointers and Arraysmain()int array10; f(array,10); f(int arr,int n);/*f(int *arr,int n)*/ Example:将数组a中的n个整数按相反顺序存放 5.3 Pointers and Arraysvoid inv(int x,int n) /*形参x是数组名*/ int temp,i,j,m; m=(n-1)/2; for(i=0;i=m;i+) j=n-1-i; temp=xi;

32、 xi=xj; xj=temp; return;main()int i,a10=3,7,9,11,0,6,7,5,4,2; printf(The original array:n); for(i=0;i10;i+) printf(%d,ai); printf(n); inv(a,10); printf(The array has benn inverted:n); for(i=0;i10;i+) printf(%d,ai); printf(n);Example:将数组a中的n个整数按相反顺序存放 5.3 Pointers and Arraysvoid inv(int *x,int n) /*形

33、参x为指针变量*/ int *p, *i,*j; int temp,m;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;main()int i,a10=3,7,9,11,0,6,7,5,4,2; printf(The original array:n); for(i=0;i10;i+) printf(%d,ai); printf(n); inv(a,10); printf(The array has benn inverted:n); for(i=0;i10;i+) printf(%

34、d,ai); printf(n);Example:用选择法对10个整数排序。 5.3 Pointers and Arraysfor(i=0;in-1;i+) r=i; for(j=i+1;jn;j+) if(xjxr) r=j;if(r!=i) t=xi; xi=xr;xr=t; void sort(int x, int n) int i,j,r,t; for(i=0;in-1;i+) r=i; for(j=i+1;jn;j+) if(xjxr) r=j;if(r!=i) t=xi; xi=xr; xr=t; main() int *p; int i,a10; p=a; for(i=0;i10

35、;i+) scanf(“ %d ”,p+); sort(p,10); for(i=0;i10;i+) printf(“%dt”,*p);p+; 选择法选择法排序排序5.3 Pointers and Arraysvoid sort(int *x, int n) int i,j,r,t; for(i=0;in-1;i+) r=i; for(j=i+1;jn;j+) if(*(x+j)*(x+k) r=j;if(r!=i) t=*(x+i); *(x+i)=*(x+k); *(x+k)=t; 选择法排序选择法排序(指针版)(指针版)5.3 Pointers and Arraysp+, p+=i,Un

36、it 1Unit ipp+p+=iUnit 25.4 Address Arithmeticint *p; p=a; p+ia0 a1 a2 a3 a4a:aian-3 an-2 an-1pp+1p+ip+2p+n-12000200220042000+2*i5.4 Address Arithmetic5.4 Address Arithmetic设p和q是指向同一数组不同成员的指针= , != , , =pqits true if p points to an earlier member of array than q does, but first p and q must point to

37、same array. 表示表示p指向的元素在指向的元素在q指向元素的前面指向元素的前面5.4 Address Arithmeticq-p /* pq, p and q point to same array*/a0 a1 a2 a3 a4a:aian-3 an-2 an-1pqq-p5.4 Address Arithmeticint strlen(char *s) char *p=s; while(*p!=0)p+; return p-s;5.4 Address Arithmetichello,world05.5 Character Pointers and Functionsmain()

38、char str=“hello,world”; printf(“%sn”,str);strStr0Str1Str12syntaxchar *pointer_name5.5 Character Pointers and Functionsmain() char *str=“hello,world”; printf(“%sn”,str);hello,world0strmain() char *str str=“hello,world”; printf(“%sn”,str);void strcpy(char *s,char *t) int i; i=0; while(ti!=0) si=ti; i+

39、; si=0;void strcpy(char *s,char *t) while(*t!=0) s+; t+; *si=0;/* array subscript version*/* pointer version 1*/5.5 Character Pointers and Functions#includemain()char a=“hello”; char b=“hello world”;strcpy(a,b);5.5 Character Pointers and Functions#includemain()char a=“hello”; char b=“hello world”; c

40、har *p1=a,*p2=b;strcpy(p1,p2);syntax:Type array_name size1 size2 00 010208 0910 111218 19int ta210;.ta00=28; ta01=ta00;5.6 Multi-dimensional Arrays5.6 Multi-dimensional Arrays5.6 Multi-dimensional Arrays5.6 Multi-dimensional Arraysdays of a yearmonth and daymonth and daydays of a year5.6 Multi-dimen

41、sional ArraysExample:date conversion, from day of the month to day of the year vice versa.static int daytab213=0,31,28,31,30,31,30,31,31,30,31,30,31,0,31,29,31,30,31,30,31,31,30,31,30,31;int day_of_year(int year, int month, int day) int i,leap; leap=(year%4=0&year%100!=0|year%400=0); for(i=1;idaytab

42、leapi;i+)yearday-=daytableapi; *pmonth=i; *pday=yearday;5.6 Multi-dimensional ArraysSince pointers are variables themselves, they can be stored in arrays just as other variables can.指针本身是变量,可以构成数组指针本身是变量,可以构成数组5.7 Pointers ArraysType *arraynamesize数据类型数据类型 *数组名数组名元素个数元素个数char *strarr3;Pointer arrays

43、指针所指向变量的数据类型指针所指向变量的数据类型指针数组赋值与初始化赋值赋值:main() int b23,*pb2; pb0=b0; pb1=b1; .int *pb2pb0pb1int b23123246 初始化初始化: main() int b23,*pb =b0,b1; . int *pb2pb0pb1int b23123246指针数组的概念定义:数组元素为指针变量的数组称为指针数组定义形式: 数据类型 *数组名数组长度说明;例 int *p4;L i s p 0F o r t r a n 0B a s i c 0p0p1p2p30赋值赋值:#include main() char a

44、 =Fortran; char b =Lisp; char c =Basic; char *p4; p0=a; p1=b; p2=c; p3=NULL; .或或:main() char *p4; p0= Fortran; p1= Lisp; p2= Basic; p3=NULL; .初始化初始化:main() char *p =Fortran, Lisp, Basic,NULL; .L i s p 0F o r t r a n 0B a s i c 0p0p1p2p30指针数组赋值与初始化 char name59=“gain”,“much”,“stronger”, “point”,“bye”;

45、 char *name5=“gain”,“much”,“stronger”, “point”,“bye”;g a i n 0s t r o n g e r 0p o i n t 0m u c h 0name0name1name2name3name4b y e 0二维数组与指针数组区别:二维数组存储空间固定二维数组存储空间固定指针数组元素的作用相当于二维数组的行名指针数组元素的作用相当于二维数组的行名但指针数组中元素是指针变量但指针数组中元素是指针变量二维数组的行名是二维数组的行名是地址常量地址常量g ain 0m u c h 0stro n g er 0p oint 0b y e 0#incl

46、ude main() int b23,*pb2; int i,j; for(i=0;i2;i+) for(j=0;j3;j+) bij=(i+1)*(j+1); pb0=b0; pb1=b1; for(i=0;i2;i+) for(j=0;j3;j+,pbi+) printf(b%d%d:%2dn,i,j,*pbi);例例 用指针数组处理二维数组用指针数组处理二维数组int b23b00 *pb0b01 *(pb0+1)b02 *(pb0+2)b10 *pb1b11 *(pb1+1)b12 *(pb1+2)123246int *pb2pb0pb1int strcmp(char *s,char

47、*t) int i; for(i=0; si=ti;i+) ; return si-ti;/* pointer version 1*/* pointer version 2*/int strcmp(char *s,char *t) for( ;*s=*t;s+,t+); return *s-*t;strcmp(s,t) function compares the character strings s and t, and return negative, zero or positive if s is less than, equal to, or greater than t.例例 对字

48、符串排序(简单选择排序)对字符串排序(简单选择排序)#include #include main() void sort(char *name,int n); char *name=Follow me,BASIC, Great Wall,FORTRAN,Computer ; int n=5; sort(name,n); for(i=0; i5; i+) printf(“%sn”,namei);void sort(char *name,int n) char *temp; int i,j,k; for(i=0;in-1;i+) k=i; for(j=i+1;j0) k=j; if(k!=i) t

49、emp=namei; namei=namek; namek=temp; name0name1name2name3name4nameGreat WallFORTRANComputerFollow meBASICkjkjjji=0例例 对字符串排序(简单选择排序)对字符串排序(简单选择排序)namename0name1name2name3name4Great WallFORTRANComputerFollow meBASICkkjjji=1k#include #include main() void sort(char *name,int n);char *name=Follow me,BASIC

50、, Great Wall,FORTRAN,Computer ; int n=5; sort(name,n); for(i=0; i5; i+) printf(“%sn”,namei);void sort(char *name,int n) char *temp; int i,j,k; for(i=0;in-1;i+) k=i; for(j=i+1;j0) k=j; if(k!=i) temp=namei; namei=namek; namek=temp; 例例 对字符串排序(简单选择排序)对字符串排序(简单选择排序)namename0name1name2name3name4Great Wall

51、FORTRANComputerFollow meBASICkkjji=2#include #include main() void sort(char *name,int n); char *name=Follow me,BASIC, Great Wall,FORTRAN,Computer ; int n=5; sort(name,n); for(i=0; i5; i+) printf(“%sn”,namei);void sort(char *name,int n) char *temp; int i,j,k; for(i=0;in-1;i+) k=i; for(j=i+1;j0) k=j;

52、if(k!=i) temp=namei; namei=namek; namek=temp; 例例 对字符串排序(简单选择排序)对字符串排序(简单选择排序)namename0name1name2name3name4Great WallFORTRANComputerFollow meBASICi=3kjk#include #include main() void sort(char *name,int n); char *name=Follow me,BASIC, Great Wall,FORTRAN,Computer ; int n=5; sort(name,n);for(i=0; i5; i+

53、) printf(“%sn”,namei);void sort(char *name,int n) char *temp; int i,j,k; for(i=0;in-1;i+) k=i; for(j=i+1;j0) k=j; if(k!=i) temp=namei; namei=namek; namek=temp; char *name=“Illegal month”, “Jan”, “Feb”, “Mar”;Illegal mont0Jan0Mar0Feb0char name15=“Illegal month”, “Jan”, “Feb”, “Mar”;Illegalm onth0Jan0

54、Feb0M ar05.8 Pointer vs. Multi-dimensional Arrays对于一维数组对于一维数组:(1)数组名)数组名array表示数组的首地址,表示数组的首地址, 即即array0的地址;的地址;(2)数组名)数组名array是地址是地址常量常量(3)array+i是元素是元素arrayi的地址的地址(4)arrayi *(array+i)arrayint array10;对于二维数组:对于二维数组: 1. a是是数组名,数组名, 包含三个元素包含三个元素 a0,a1,a22. 每个元素每个元素ai 又是一个一维又是一个一维 数组,包含数组,包含 4 个个 元素元素

55、aa+1a+2int a34;a0a1a22000 20082016200020022008201020162018a00a01a10a11a20a21a02a03a12a13a22a23行指针行指针#include main() int a34=1,3,5,7,9,11,13,15,17,19,21,23; int *p; for(p=a0;pa0+12;p+) if(p-a0)%4=0) printf(n); printf(%4d ,*p); 多维数组的指针指向数组元素的指针变量例例 指向二维数组元素的指针变量指向二维数组元素的指针变量int a34;a00a01a10a11a20a21a

56、02a03a12a13a22a23pp=a;for (i=0;i3;i+) for (j=0;j4;j+) printf(“%4d”,*(p+4*i+j); printf(“n”);p的值是一维数组的的值是一维数组的首地址,首地址,p是是行指针行指针指向由m个数组成的一维数组的指针变量 定义形式: 数据类型 (*指针名)一维数组维数; 例 int (*p)4;( )不能少不能少int (*p)4与与int *p4不同不同可让p指向二维数组某一行 如 int a34, (*p)4=a;p0+1p1+2一维数组指针变量维数和一维数组指针变量维数和二维数组二维数组列数列数必须相同必须相同int a3

57、4;a00a01a10a11a20a21a02a03a12a13a22a23aa+1a+2pp+1p+2a001a012a023a034a103a114a125a136a205a216a227a238pp +1p +2p1200020082016p11p1+1行行指指针针列指针列指针#include /*c9_4_1.c,c9_4_2.c,c9_4_3.c*/main() int a34=1,3,5,7,9,11,13,15,17,19,21,23; int i, j, (*p)4; for(p=a, i=0;i3;i+,p+) for(j=0;j4;j+) printf(%d ,*(*p+j); printf(n);例例 一维数组指针变量举例:一维数组指针变量举例: 输出二维数组每行每列元素的值输出二维数组每行每列元素的值int a34;a00a01a10a11a20a21a02a03a12a13a22a23ppp p0j p1j p2jHomework:1)写一个函数将一个)写一个函数将一个3维的方阵转置。维的方阵转置。

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 研究生课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号