第7章指针ppt课件

上传人:桔**** 文档编号:589824514 上传时间:2024-09-11 格式:PPT 页数:67 大小:315.53KB
返回 下载 相关 举报
第7章指针ppt课件_第1页
第1页 / 共67页
第7章指针ppt课件_第2页
第2页 / 共67页
第7章指针ppt课件_第3页
第3页 / 共67页
第7章指针ppt课件_第4页
第4页 / 共67页
第7章指针ppt课件_第5页
第5页 / 共67页
点击查看更多>>
资源描述

《第7章指针ppt课件》由会员分享,可在线阅读,更多相关《第7章指针ppt课件(67页珍藏版)》请在金锄头文库上搜索。

1、白 雪 飞中国科学技术大学电子科学与技术系Dept. of Elec. Sci. & Tech., USTCFall, 2003第第7章章 指指 针针目 录l指针概念l指针变量和指针运算l指向数组的指针l指向字符串的指针l指向函数的指针l返回指针值的函数l指针数组和指向指针的指针2 2C C语言程序设计语言程序设计 - - 第第7 7章章 指针指针指针 (Pointer)l指针表示变量等的存储地址l使用指针可以获得紧凑、高效的代码l使用指针也可能使程序晦涩难懂l指针的使用灵活方便l指针操作容易出错且难以调试l指针与数组关系密切3 3C C语言程序设计语言程序设计 - - 第第7 7章章 指针指

2、针指针与地址l地址n通过首地址和数据类型可以访问内存中某一数据n数据类型决定所占用存储单元数l指针n就是地址n和类型有关4 4C C语言程序设计语言程序设计 - - 第第7 7章章 指针指针指针变量和指针运算l变量的指针和指针变量l指针变量的定义l地址运算符和指针运算符l指针变量的引用l指针的运算5 5C C语言程序设计语言程序设计 - - 第第7 7章章 指针指针变量的指针和指针变量l变量的指针n内存中存储某个变量的存储单元的首地址n指针(地址)实质上是一个整数(不是C的整型)n可以通过变量的地址来间接的访问变量l指针变量n指针(地址)是一个数据,也可以用另一个变量来存放,即指针变量n通过指

3、针变量可以间接访问变量或内存数据6 6C C语言程序设计语言程序设计 - - 第第7 7章章 指针指针指针变量的定义l一般形式n基类型 *指针变量名;l说明n“基类型”表示该指针指向的数据的类型n可以定义基类型为空类型void的指针变量l举例nint *pi;nchar *pc1, c, *pc2;nvoid *p;7 7C C语言程序设计语言程序设计 - - 第第7 7章章 指针指针地址运算符 (Address Operator)l地址运算符 &n获得操作数的地址(指针)n单目运算符,自右向左结合,优先级较高n操作数应为各种类型的内存变量、数组元素、结构体成员等n操作数不能是表达式、常量、寄

4、存器变量l举例nscanf(%f, &score);nint i, *p=&i;8 8C C语言程序设计语言程序设计 - - 第第7 7章章 指针指针指针运算符 (Indirection Operator)l指针运算符 *n获得指针指向的内存数据n又称“间接访问运算符”n单目运算符,自右向左结合,优先级较高n操作数为具有指针(地址)意义的值l举例nint i, *p=&i;(*p)+; /* i+; */9 9C C语言程序设计语言程序设计 - - 第第7 7章章 指针指针指针变量的引用l指针变量也要“先赋值,后使用”l没有赋值的指针变量所存储的地址数据是不确定的,对它的引用非常危险l对指针的

5、赋值要注意类型匹配,必要时可以使用强制类型转换,但要慎重使用l*p可以用于与指针p的基类型相同类型的变量可以使用的任何场合l指针变量可以作为函数的参数1010C C语言程序设计语言程序设计 - - 第第7 7章章 指针指针指针变量引用举例 (07-01.C)int a, b, c, *pa, *pb, *pc;pa = &a;pb = &b;pc = &c;a = 100;printf(*pa=%dn, *pa); /* *pa=100 */*pb = 200;printf(b=%dn, b);/* b=200 */scanf(%d, pc);/* 输入34 */printf(c=%dn, c

6、);/* c=34 */1111C C语言程序设计语言程序设计 - - 第第7 7章章 指针指针指针变量与所指变量的关系1020papbabint a, b;int *pa, *pb;pa = &a;pb = &b;*pa = 10;b = 20;pa = pb;pb = &a;&a,&*pa*pa,*&a1212C C语言程序设计语言程序设计 - - 第第7 7章章 指针指针指针变量作为函数参数l参数传递n仍然遵循“单向值传递”的规则n这里的传递规则是指针类型参数的值的传递n作为参数的指针型实参的值不会改变n但是对指针型实参所指向的内存数据所作的操作将不会随函数的返回而恢复l用途n借助指针类

7、型参数可以改变多个数据的值1313C C语言程序设计语言程序设计 - - 第第7 7章章 指针指针指针类型函数参数举例 (07-02.C)void swap(int *x, int *y)int t;t=*x, *x=*y, *y=t;void main()int a=1, b=4;int *pa, *pb;pa=&a, pb=&b;swap(pa, pb);&aa&bpb1441bpa&a&byx参数传递1414C C语言程序设计语言程序设计 - - 第第7 7章章 指针指针指针的运算l运算类型n算术运算:加、减、自增、自减n关系运算:所有关系运算n赋值运算:一般赋值、加赋值、减赋值n上述运

8、算在一定约束条件下才有意义(后详)l变量说明np,q是同类型的指针变量nn是整型变量1515C C语言程序设计语言程序设计 - - 第第7 7章章 指针指针指针的算术运算运算方式说 明p+np之后第n个元素的地址p-np之前第n个元素的地址p+p作为当前操作数,然后后移一个元素+pp后移一个元素,然后作为当前操作数p-p作为当前操作数,然后前移一个元素-pp前移一个元素,然后作为当前操作数p-q表示p和q两者之间的元素个数l条件:p,q是指向同一数据集合(数组)的指针l注意避免数组越界1616C C语言程序设计语言程序设计 - - 第第7 7章章 指针指针指针的关系运算l条件np,q是指向同一

9、数据集合(数组)的指针l运算方式npq、p=q、pqnpq) printf(%d, p-q);else printf(%d, q-p);p pq q3 3个个个个s sh ho or rt t2020C C语言程序设计语言程序设计 - - 第第7 7章章 指针指针指向数组的指针l指针与数组的关系l指向数组的指针l通过指针引用数组元素l数组用作函数参数l指向二维数组的指针2121C C语言程序设计语言程序设计 - - 第第7 7章章 指针指针指针与数组的关系l数组名是“常量指针”n数组名表示数组的首地址,因此数组名也是一种指针(地址)n数组名表示的地址(指针)不能被修改,所以称之为“常量指针”l

10、数组的指针n数组的起始地址n与数组名表示的指针相同n与数组的第一个元素(a0)的地址相同2222C C语言程序设计语言程序设计 - - 第第7 7章章 指针指针数组和指针的用法l数组名不能被赋值和修改,若指针指向数组,则两者的其他用法基本相同l定义指针时,只分配一段用来存放地址的空间,而没有分配存放数据的空间l定义数组时,为所有元素分配相应的连续的存储空间,但没有存放地址的空间l指针应赋值后才能使用l数组名不能被赋值,可以直接使用2323C C语言程序设计语言程序设计 - - 第第7 7章章 指针指针指向数组的指针char a10, *p;p = &a0;char a10, *p=&a0;ch

11、ar a10, *p;p = a;char a10, *p=a;ap&a02424C C语言程序设计语言程序设计 - - 第第7 7章章 指针指针通过指针引用数组元素l当一个指针变量指向数组或某个数组元素时,可以通过这个指针变量引用所有的数组元素l引用数组元素的方法n下标运算符,例如ai、pin指针运算符*,例如*(a+i)、*(p+i)l注意数组名不能被修改和赋值l注意防止下标越界2525C C语言程序设计语言程序设计 - - 第第7 7章章 指针指针通过指针引用数组元素图示p0, *p, *ap, ap+1, a+1p1, *(p+1), *(a+1)q+i-2, p+i, a+ipi,

12、*(p+i), *(a+i)qi-2, *(q+i-2), p+9, a+9p9, *(p+9), *(a+9)q, p+2, a+2p2, *(p+2), *(a+2) q0, *q2626C C语言程序设计语言程序设计 - - 第第7 7章章 指针指针数组名和指针引用数组元素比较 (1)l指针指向数组首地址n前提条件:int a10, *p=a;nai、pi、*(a+i)、*(p+i)等用法都是合法的,且它们都表示同一个数组元素na+i(或p+i)不是简单的在a(或p)表示的地址值上简单的加i,而是加上i个基类型所需的地址偏移量,即加上i*sizeof(int)n指针值可以改变,如p+为下

13、一元素的地址n数组名的值不能修改,如a+是非法操作2727C C语言程序设计语言程序设计 - - 第第7 7章章 指针指针数组名和指针引用数组元素比较 (2)l指针指向某个数组元素n前提条件:p=a+i;n*(p+)与ai+等价n*(p-)与ai-等价n*(+p)与a+i等价n*(-p)与a-i等价n注意不能使用*(a+)或a=p+i这种形式n注意区分运算顺序,*(p+)与(*p)+l注意防止下标越界,注意掌握指针位置2828C C语言程序设计语言程序设计 - - 第第7 7章章 指针指针通过指针引用数组元素举例int a10, i, *p;p = a;/* 指针需要先赋值 */while (

14、pa+10) /* 指针在数组范围内移动 */ scanf(%d, p+); /* 指针向下移动 */p = a;/* 指针指向正确位置 */for (i=0; i10; i+) printf(%d, pi); /* 指针使用 */2929C C语言程序设计语言程序设计 - - 第第7 7章章 指针指针数组用作函数参数l数组元素用作函数实参n与同类型的一般变量用法相同l数组用作函数参数n数组类型可以作为函数参数类型n数组可以用作函数的形参和实参n定义函数时,数组型形参实际上作为指针型形参处理,实参可用相同类型的数组或指针n声明数组类型形参时,不需要指定数组长度n一般应把数组长度作为另一个参数传

15、递3030C C语言程序设计语言程序设计 - - 第第7 7章章 指针指针以数组作为实参的几种方法 (1)l形参用数组名实参用数组名l形参用指针变量实参用数组名f(int x, int n) . . main() int a10; . . f(a, 10);f(int *x, int n) . . main() int a10; . . f(a, 10);3131C C语言程序设计语言程序设计 - - 第第7 7章章 指针指针以数组作为实参的几种方法 (2)l形参用数组名实参用指针变量l形参用指针变量实参用指针变量f(int x, int n) . . main() int a10, *p=a

16、; . . f(p, 10);f(int *x, int n) . . main() int a10, *p=a; . . f(p, 10);3232C C语言程序设计语言程序设计 - - 第第7 7章章 指针指针数组用作函数参数举例l选择排序法3333C C语言程序设计语言程序设计 - - 第第7 7章章 指针指针例1:选择排序法 (07-03.C)void sort(int x, int n) /* int *x */ 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,

17、xk=t; 3434C C语言程序设计语言程序设计 - - 第第7 7章章 指针指针例1:选择排序法 (续)void main() int a10, *p, i; p = a; for (i=0; i10; i+) scanf(%d, p+); p = a; sort(p, 10); /* sort(a, 10); */ for (p=a,i=0; iy?x:y; void main() int (*p)(int, int); /* 定义指针变量 */ int a, b, c; scanf(%d%d, &a, &b); p = max; /* 用函数名赋值 */ c = (*p)(a, b);

18、 /* c=max(a,b); */5151C C语言程序设计语言程序设计 - - 第第7 7章章 指针指针指向函数的指针用作函数参数举例l一元函数定积分的梯形法数值求解5252C C语言程序设计语言程序设计 - - 第第7 7章章 指针指针例:一元函数定积分 (07-04.C)double integral(double (*f)(double), double a, double b) double s, h; int n=100, i; h = (b-a)/n; s = (*f)(a)+(*f)(b)/2.0; for(i=1; in; i+) s += (*f)(a+i*h); ret

19、urn s*h;5353C C语言程序设计语言程序设计 - - 第第7 7章章 指针指针例:一元函数定积分 (续)#include #include void main() double y1, y2, y3; y1 = integral(sin, 0.0, 1.0); y2 = integral(cos, 0.0, 2.0); y3 = integral(exp, 0.0, 3.5); printf(%lfn%lfn%lfn, y1,y2,y3); 5454C C语言程序设计语言程序设计 - - 第第7 7章章 指针指针返回指针值的函数l函数的返回值可以是指针类型l定义形式n类型 *函数名(

20、参数列表);l举例nint *foo(int x, int y);l说明n函数调用可以结合使用*和运算符n注意与指向函数的指针区别int (*foo)(int x, int y);5555C C语言程序设计语言程序设计 - - 第第7 7章章 指针指针返回指针值的函数举例 (1)int *f(int *px, int *py) /* 返回整型指针 */ return *px*py?px:py; /* 较大数的地址 */void main() int a=2, b=3, c=9; *f(&a,&b)=c; /* 赋值给a和b中较大的数 */ printf(%dn, b); /* 输出9 */56

21、56C C语言程序设计语言程序设计 - - 第第7 7章章 指针指针返回指针值的函数举例 (2)int *f(int *a, int *b) /* 返回整型指针 */ return *a*b?a:b; /* 返回第一个元素 */ /* 较大的数组地址 */void main() int i, a=1,2,3,4, b=5,6,7,8; for (i=0; i4; i+) printf(%dn, f(a,b)i); /* 打印数组b的元素 */5757C C语言程序设计语言程序设计 - - 第第7 7章章 指针指针指针数组和指向指针的指针l指针数组n类型 *数组名长度;n元素是指针类型的数组n举

22、例,char *p4;n注意与基类型为数组的指针区分char (*p)4;l指向指针的指针n基类型为指针类型的指针n举例,char *p;5858C C语言程序设计语言程序设计 - - 第第7 7章章 指针指针指针数组举例/* 把所有名字的所有字母全部改成大写 */void main() char *name=Tom, John, Kate; int i, j; for (i=0; i=a & nameij=z) nameij-=32;5959C C语言程序设计语言程序设计 - - 第第7 7章章 指针指针指向指针的指针举例/* 利用指向字符指针的指针打印字符串数组 */void main()

23、 char *name=Tom, John, Kate; char *p; int i; p = name; for (i=0; iecho C Languageargc = 3;argv0 = echo;argv1 = C;argv2 = Language;#include int main(int argc, char *argv) while(-argc 0) printf(%s%c, *+argv, (argc1)? :n); return 0;6262C C语言程序设计语言程序设计 - - 第第7 7章章 指针指针复杂的声明形式l复杂类型变量的声明容易混淆n指针数组和指向数组的指针i

24、nt *a5; int (*a)5;n指向函数的指针和返回指针值的函数void (*f)(); void *f();l过于复杂的声明形式使程序晦涩难懂,而且容易出错l可以用typedef关键字把复杂类型的变量声明用若干个容易理解的小步骤表示6363C C语言程序设计语言程序设计 - - 第第7 7章章 指针指针分析声明形式的方法l从标识符开始,逐层分析其意义l按运算符优先级和结合方向的顺序进行l可能涉及的运算符包括n()自左向右结合改变结合顺序;或声明一个函数,向外一层是函数返回值类型声明n自左向右结合声明一个数组,向外一层是数组元素类型声明n* 自右向左结合声明一个指针类型,向外一层是指针基

25、类型声明6464C C语言程序设计语言程序设计 - - 第第7 7章章 指针指针声明形式分析举例char (*(*x3)()5;x是一个长度为3的数组数组的元素是指针类型指针是指向函数的函数的返回值是指针类型指向长度为5的字符数组x is an array3 of pointer to functionreturning pointer to array5 of char6565C C语言程序设计语言程序设计 - - 第第7 7章章 指针指针void类型指针l定义形式nvoid *p;l说明n定义一个指针,但不指定它指向的数据类型n不能通过*p引用它指向的数据nvoid*指针可以与其他任何类型的指针相互赋值和比较,而不需要显式的强制类型转换n经常作为函数形参和返回值的类型6666C C语言程序设计语言程序设计 - - 第第7 7章章 指针指针结束The End6767C C语言程序设计语言程序设计 - - 第第7 7章章 指针指针

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

最新文档


当前位置:首页 > 建筑/环境 > 施工组织

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