语言讲义PPT学习教案_第1页
语言讲义PPT学习教案_第2页
语言讲义PPT学习教案_第3页
语言讲义PPT学习教案_第4页
语言讲义PPT学习教案_第5页
已阅读5页,还剩71页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、会计学1 语言讲义语言讲义 n如何利用指针实现内存的动态分 配? 第1页/共76页 第2页/共76页 n密码密码911911存放在某个寄存箱内,如果我们存放在某个寄存箱内,如果我们 知道这个寄存箱的名字,就能够找到密知道这个寄存箱的名字,就能够找到密 码码 n如果不知道密码所在的寄存箱名字,知如果不知道密码所在的寄存箱名字,知 道该寄存箱的地址也照样能够取出密码道该寄存箱的地址也照样能够取出密码 n如果寄存箱的地址也不知道,但是有另如果寄存箱的地址也不知道,但是有另 外一个地方存放这个寄存箱的地址,就外一个地方存放这个寄存箱的地址,就 能顺藤摸瓜,间接找到密码能顺藤摸瓜,间接找到密码 第3页/

2、共76页 龙井号龙井号 9111976 虎跑号虎跑号 19760217 名字名字虎跑号虎跑号龙井号龙井号 地址地址02171976 内容内容1976911 第4页/共76页 The key is: 911 If I know the address of the key, I also can get it: 911 第5页/共76页 内存单元内存单元 地址地址 内容内容 变量变量 int x = 20, y = 1, z = 155; printf(%d, x;) 直接访问直接访问:通过变量名访问:通过变量名访问 间接访问间接访问:通过通过另一个变量访问另一个变量访问 把变量的地址放到另一变

3、量中把变量的地址放到另一变量中 使用时先找到后者使用时先找到后者 再再从中取出前者的地址从中取出前者的地址 1000 20 x 1002 1 y 1004 155 z 2000 1000 p 2002 地址地址 指针变量指针变量 第6页/共76页 内存单元内存单元 地址地址 内容内容 变量变量 int x = 20, y = 1, z = 155; printf(%d, x;) 1000 20 x 1002 1 y 1004 155 z 2000 1000 p 2002 地址地址 指针变量指针变量 指针变量指针变量:存放地址的变量:存放地址的变量 某个某个变量变量的地址的地址 指向指向 第7页

4、/共76页 指针变量所指向的变量的类型指针变量所指向的变量的类型 int *p; p 是整型指针,指向整型变量是整型指针,指向整型变量 float *fp; fp 是浮点型指针,指向浮点型变量是浮点型指针,指向浮点型变量 char *cp; cp 是字符型指针,指向字符型变量是字符型指针,指向字符型变量 指针声明符指针声明符 第8页/共76页 类型名类型名 * 指针变量名指针变量名 int * p; 指针变量名是指针变量名是 p,不是不是*p * 是指针声明符是指针声明符 int k, *p1, *p2; 等价于:等价于: int k; int *p1; int *p2; 第9页/共76页 *

5、 间接访问运算符间接访问运算符,访问指针所指向的变量访问指针所指向的变量 *p:指针变量指针变量 p 所所指向的指向的变量变量 a 3 p = printf (“a=%d, *p=%dn”, a, *p); *p = 10; printf(a=%d, *p=%dn, a, *p); printf(Enter a: ); scanf(%d, printf(a=%d, *p=%dn, a, *p); (*p)+; printf(a=%d, *p=%dn, a, *p); return 0; a 3 定义定义指针指针变量变量 p *p =10; 指针指针p所指所指向向的变量的变量,即即a (3) p

6、 = x = *p+; 第12页/共76页 b 2 int *p1, *p2; p1 = p2 = printf (a=%d, b=%d, *p1=%d, *p2=%dn, a, b, *p1, *p2); t = *p1; *p1 = *p2; * p2 = t; printf (a=%d, b=%d, *p1=%d, *p2=%dn, a, b, *p1, *p2); return 0; 例例8-3 通过通过指针指针改变改变变量的值变量的值 a = 1, b = 2, *p1 = 1, *p2 = 2 a = 2, b = 1, *p1 = 2, *p2 = 1 第13页/共76页 a 3

7、 a = 2; b = 4; c = 6; p1 = p2 = printf (a=%d, b=%d, c=%d, *p1=%d, *p2=%dn, a, b, c, *p1, *p2); p2 = p1; p1 = printf (a=%d, b=%d, c=%d, *p1=%d, *p2=%dn, a, b, c, *p1, *p2); return 0; *p2 *p1 a = 2; b = 4; c = 6; *p1 = 2, *p2 = 4 a = 2; b = 4; c = 6; *p1 = 6, *p2 = 2 第15页/共76页 例例8-5 int main (void ) i

8、nt a=1, b=2; int *p1 = printf (a=%d, b=%d, *p1=%d, *p2=%dn, a, b, *p1, *p2); pt = p1; p1 = p2; p2 = pt; printf (“a=%d, b=%d, *p1=%d, *p2=%dn”, a, b, *p1, *p2); return 0; p1 b 2 b = 2; *p1 = 1, *p2 = 2 a = 1; b = 2; *p1 = 2, *p2 = 1 第16页/共76页 *p1 和和 *p2 的值都由的值都由 1 和和 2 变成了变成了 2 和和 1 (1) 直接改变指针的值直接改变指

9、针的值 (2) 改变指针所指变量的值改变指针所指变量的值 p1 b 2 void replace2(int *baby) *baby = CIVET; void display(int who) if (who = CIVET) printf(狸猫狸猫); else if (who = PRINCE) printf(王子王子); before change, baby is 王子王子 after first action, baby is王子王子 after second action, baby is狸猫狸猫 第19页/共76页 int main (void) int a = 1, b =

10、2; int *pa = void swap1(int x, int y), swap2( int *px, int *py ), swap3 (int *px, int *py); swap1 (a, b); printf (“After calling swap1: a=%d b=%dn”, a, b); a = 1; b = 2; swap2(pa, pb); printf (“After calling swap2: a=%d b=%dn”, a, b); a = 1; b = 2; swap3(pa, pb); printf (“After calling swap3: a=%d b

11、=%dn”, a, b); return 0; 调用哪个函数,可以交换调用哪个函数,可以交换main ()中变量中变量a和和b的值的值? 第20页/共76页 a 12 b x 12 y 21 第21页/共76页 a b pxpy 12 值传递,地值传递,地址未变,址未变, 但存放的变量的值改变了但存放的变量的值改变了 21 第22页/共76页 a b pxpy 12 值传递,形参指针的改变值传递,形参指针的改变 不会影响实参不会影响实参 第23页/共76页 要通过函数调用来改变主调函数中某个变量的值:要通过函数调用来改变主调函数中某个变量的值: (1) 在主调函数中,在主调函数中,将该变量的地

12、址或者指向该变量的将该变量的地址或者指向该变量的 指针作为实参指针作为实参 (2) 在被调函数中,在被调函数中,用指针类型形参接受该变量的地址用指针类型形参接受该变量的地址 (3) 在被调函数中,改变形参所指向变量的值在被调函数中,改变形参所指向变量的值 a b pxpy 1221 After calling swap1: a=1, b=2 After calling swap2: a=2, b=1 After calling swap3: a=1, b=2 第24页/共76页 第25页/共76页 input year and yearday: 2000 61 2000-3-1 month d

13、ay pmonthpday 31 第26页/共76页 void swap2 (int *, int *); void bubble (int a , int n); int main(void) int n, a8; int i; printf(Enter n (n=8): ); scanf(%d, printf(Enter a%d : ,n); for (i=0; in;i+) scanf(%d, bubble(a, n); printf(After sorted, a%d = , n); for (i=0; in; i+) printf(%3d,ai); return 0; void bu

14、bble (int a , int n) int i, j; for( i = 1; i n; i+ ) for (j = 0; j aj+1) swap2 ( void swap2 (int *px, int *py) int t; t = *px; *px = *py; *py = t; Enter n (n=8): 8 Enter a8 : 7 3 66 3 -5 22 -77 2 After sorted, a8 = -77 -5 2 3 3 7 22 66 第27页/共76页 3000 a0 地址地址 内容内容 数组元素数组元素 3002 a1 3198 a99 ai a a+1 a

15、+99 a+i for(i = 0; i 100; i+) sum = sum + ai ; *(a+i) 下标运算符下标运算符 的含义的含义 第28页/共76页 p p+1 p+99 p+i 3000 a0 地址地址 内容内容 数组元素数组元素 3002 a1 3198 a99 ai a a+1 a+99 a+i sum = 0; for(i = 0; i 100; i+) sum = sum + pi; 等价等价 等价等价 第29页/共76页 p3000 a0 地址地址 内容内容 数组元素数组元素 3002 a1 3198 a99 ai a a+1 a+99 a+i sum = 0; fo

16、r(p = a; p = p+) sum = sum + *p; p p p 第30页/共76页 # include int main (void) double a2, *p, *q; p = q = p + 1; printf (%dn, q - p); printf (%dn, (int) q - (int) p); return 0; 例例8-10 使用指针计算数组元素个数和使用指针计算数组元素个数和 数组元素的存储单元数数组元素的存储单元数 1 8 指针指针p p和和q q之间元素的个数之间元素的个数 指针指针p p和和q q之间的字节数之间的字节数 地址值地址值 p q 3000

17、a0 地址地址 内容内容 数组元素数组元素 3008 a1 a a+1 第31页/共76页 double *p, *q; nq - p 两个相同类型的指针相减,表示它们之间相隔的存储单元两个相同类型的指针相减,表示它们之间相隔的存储单元 的数目的数目 np + 1 / p-1 指向下一个存储单元指向下一个存储单元 / 指向上一个存储单元指向上一个存储单元 n其他操作都是非法的其他操作都是非法的 指针相加、相乘和相除,或指针加上和减去一个浮点数指针相加、相乘和相除,或指针加上和减去一个浮点数 np q 两个相同类型指针可以用关系运算符比较大小两个相同类型指针可以用关系运算符比较大小 指针的算术运

18、算和比较运算指针的算术运算和比较运算 p q 3000 a0 地址地址 内容内容 数组元素数组元素 3008 a1 a a+1 第32页/共76页 # include int main(void) int i, a10, *p; long sum = 0; printf(Enter 10 integers: ); for(i = 0; i 10; i+) scanf(%d, for(p = a; p = a+9; p+) sum = sum + *p; printf(sum=%ld n, sum); return 0; 例例8-11 使用指针计算数组元素之和使用指针计算数组元素之和 Enter

19、 10 integers: 10 9 8 7 6 5 4 3 2 1 sum=55 p3000 a0 地址地址 内容内容 数组元素数组元素 3002 a1 3018 a9 ai a a+1 a+9 a+i p p p 第33页/共76页 double fact (int n); int main(void ) int i, n = 5; double sum; sum = 0; for(i = 1; i = n; i+ ) sum = sum + fact (i); printf(sum = %en, sum); return 0; double fact (int n) i n t i ;

20、double result = 1; for (i = 1; i = n; i+) result = result * i ; return result ; int a5=1, 4, 5, 7, 9; fact(ai- 1); 1!+4!+5!+7!+9! 第34页/共76页 int sum (int *array, int n) int i, s = 0; for(i=0; in; i+) s += arrayi; return(s); 例例8-12 int main(void ) int i; int b5 = 1, 4, 5, 7, 9; printf(%dn, sum(b, 5);

21、return 0; (1) (1) 实参是数组名实参是数组名 (2) (2) 形参是指针变量形参是指针变量 可以写成数组形式可以写成数组形式 int array *(array+i) 第35页/共76页 int main(void ) int i; int b5 = 1, 4, 5, 7, 9; printf(%dn, sum(b, 5); return 0; b b0 b5 array sum(b, 5)b0+b1+.+b4 sum(b, 3)b0+b1+b2 sum(b+1, 3)b1+b2+b3 sum( for(i=0, j=n-1; ij; i+, j-) t = pi; pi =

22、pj; pj = t; Enter n:10 Enter 10 integers: 10 9 8 7 6 5 4 3 2 1 1 2 3 4 5 6 7 8 9 10 第37页/共76页 a a0 a5 p 第38页/共76页 void reverse(int *p, int n) int *pj, t; for(pj=p+n-1; paj+1 j=0 to 4 j=0 to 3 j=0 to 2 j=0 to 6-1-i 第41页/共76页 9 8 5 4 6 0 i=1 j=0: 8 9 5 4 6 0 j=1: 8 5 9 4 6 0 j=2: 8 5 4 9 6 0 j=3: 8 5

23、4 6 9 0 j=4: 8 5 4 6 0 9 int main(void ) int i, j, n, t, a10; n = 6; for(i = 0; i n; i+) scanf(%d, for(i = 1; i n; i+) for(j = 0; j aj+1) t = aj; aj = aj+1; aj+1 = t; return 0; 第42页/共76页 int main(void ) int i, a10; for(i=0; i10; i+) scanf(%d, sort(a, 10); for(i=0; i10; i+) printf(%d , ai); printf(n)

24、; return 0; void sort(int array, int n) int i, j, t; for(i=1; in; i+) for(j=0; jarrayj+1) t = arrayj; arrayj = arrayj+1; arrayj+1 = t; 第43页/共76页 第44页/共76页 # define MAXLINE 100 void encrypt(char *s); int main (void) char line MAXLINE; printf (Input the string: ); gets(line); encrypt (line); printf (“

25、After being encrypted: %sn, line); return 0; void encrypt ( char *s) for ( ; *s != 0; s+) if (*s = z) *s = a; else *s = *s+1; Input the string:hello hangzhou After being encrypted: ifmmp!ibohaipv 第45页/共76页 第46页/共76页 a r r a y p o i n t string printf(%s , sa+2); printf(%s , sp+3); printf(%sn, string+

26、1); ray nt tring 数组名数组名sa、指针、指针sp和字符串和字符串 string 的值都是的值都是 地址地址 第47页/共76页 char sa = This is a string; char *sp = This is a string; sa T h i si sas t r i n g 0 sp T h i si sas t r i n g 0 如果要改变数组如果要改变数组sa所代表的字符串,只能改变所代表的字符串,只能改变 数组元素的内容数组元素的内容 如果要改变指针如果要改变指针sp所代表的字符串,通常直所代表的字符串,通常直 接改变指针的值,让它指向新的字符串接改

27、变指针的值,让它指向新的字符串 第48页/共76页 第49页/共76页 不要引用未赋值的指针不要引用未赋值的指针 第50页/共76页 void encrypt ( char *s) for ( ; *s != 0; s+) if (*s = z) *s = a; else *s = *s+1; 第51页/共76页 第52页/共76页 n t 第53页/共76页 第54页/共76页 #include int main( ) char str80; gets(str); puts(str); puts(Hello); return 0; Programming ProgrammingHello P

28、rogramming is fun! ProgrammingHello Programmin g Programmin g Hello Programming is fun! Programming is fun! Hello 第55页/共76页 第56页/共76页 h a p p y 0 0 strcpy(str1, str2); h a p p y 0 str1 中中 strcpy(str1, “world”); str1 中中: w o r l d 0 第57页/共76页 1234 1234 第58页/共76页 # include stdio.h # include string.h int main(void) char str180, str220; gets(str1); gets(str2); strcat(str1, str2); puts(str1); return 0; str1中:中: Let us 0 str2中:中:go.0 str1中:中: Let us go.0 str2中:中:go.0 Let us go. Let us go. 第59页/共76页 strcmp(s1, Sea); strcmp(Sea, Sea );

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论