




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、白 雪 飞中国科学技术大学电子科学与技术系Dept. of Elec. Sci. & Tech., USTCFall, 2003l指针概念l指针变量和指针运算l指向数组的指针l指向字符串的指针l指向函数的指针l前往指针值的函数l指针数组和指向指针的指针l指针表示变量等的存储地址l运用指针可以获得紧凑、高效的代码l运用指针也能够使程序晦涩难懂l指针的运用灵敏方便l指针操作容易出错且难以调试l指针与数组关系亲密l地址l经过首地址和数据类型可以访问内存中某一数据l数据类型决议所占用存储单元数l指针l就是地址l和类型有关l变量的指针和指针变量l指针变量的定义l地址运算符和指针运算符l指针变量的
2、援用l指针的运算l变量的指针l内存中存储某个变量的存储单元的首地址l指针(地址)本质上是一个整数(不是C的整型)l可以经过变量的地址来间接的访问变量l指针变量l指针(地址)是一个数据,也可以用另一个变量来存放,即指针变量l经过指针变量可以间接访问变量或内存数据l普通方式l基类型 *指针变量名;l阐明l“基类型表示该指针指向的数据的类型l可以定义基类型为空类型void的指针变量l举例lint *pi;lchar *pc1, c, *pc2;lvoid *p;l地址运算符 &l获得操作数的地址(指针)l单目运算符,自右向左结合,优先级较高l操作数应为各种类型的内存变量、数组元素、构造体成员
3、等l操作数不能是表达式、常量、存放器变量l举例lscanf(%f, &score);lint i, *p=&i;l指针运算符 *l获得指针指向的内存数据l又称“间接访问运算符l单目运算符,自右向左结合,优先级较高l操作数为具有指针(地址)意义的值l举例lint i, *p=&i;l(*p)+; /* i+; */l指针变量也要“先赋值,后运用l没有赋值的指针变量所存储的地址数据是不确定的,对它的援用非常危险l对指针的赋值要留意类型匹配,必要时可以运用强迫类型转换,但要慎重运用l*p可以用于与指针p的基类型一样类型的变量可以运用的任何场所l指针变量可以作为函数的参数int
4、 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);/* c=34 */1020papbabint a, b;int *pa, *pb;pa = &a;pb = &b;*pa = 10;b = 20;pa = pb;pb = &a;&a,&*p
5、a*pa,*&al参数传送l依然遵照“单向值传送的规那么l这里的传送规那么是指针类型参数的值的传送l作为参数的指针型实参的值不会改动l但是对指针型实参所指向的内存数据所作的操作将不会随函数的前往而恢复l用途l借助指针类型参数可以改动多个数据的值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参数传送l运算类型l算术运算:加、减
6、、自增、自减l关系运算:一切关系运算l赋值运算:普通赋值、加赋值、减赋值l上述运算在一定约束条件下才有意义(后详)l变量阐明lp,q是同类型的指针变量ln是整型变量运算方式说 明p+np之后第n个元素的地址p-np之前第n个元素的地址p+p作为当前操作数,然后后移一个元素+pp后移一个元素,然后作为当前操作数p-p作为当前操作数,然后前移一个元素-pp前移一个元素,然后作为当前操作数p-q表示p和q两者之间的元素个数l条件:p,q是指向同一数据集合(数组)的指针l留意防止数组越界l条件lp,q是指向同一数据集合(数组)的指针l运算方式lpq、p=q、pqlpq) printf(%d, p-q)
7、;else printf(%d, q-p);l指针与数组的关系l指向数组的指针l经过指针援用数组元素l数组用作函数参数l指向二维数组的指针l数组名是“常量指针l数组名表示数组的首地址,因此数组名也是一种指针(地址)l数组名表示的地址(指针)不能被修正,所以称之为“常量指针l数组的指针l数组的起始地址l与数组名表示的指针一样l与数组的第一个元素(a0)的地址一样l数组名不能被赋值和修正,假设指针指向数组,那么两者的其他用法根本一样l定义指针时,只分配一段用来存放地址的空间,而没有分配存放数据的空间l定义数组时,为一切元素分配相应的延续的存储空间,但没有存放地址的空间l指针应赋值后才干运用l数组名
8、不能被赋值,可以直接运用pa&a0l当一个指针变量指向数组或某个数组元素时,可以经过这个指针变量援用一切的数组元素l援用数组元素的方法l下标运算符,例如ai、pil指针运算符*,例如*(a+i)、*(p+i)l留意数组名不能被修正和赋值l留意防止下标越界p0, *p, *ap, ap+1, a+1p1, *(p+1), *(a+1)q+i-2, p+i, a+ipi, *(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, *ql指针指向数组首地址l前提条件:in
9、t a10, *p=a;lai、pi、*(a+i)、*(p+i)等用法都是合法的,且它们都表示同一个数组元素la+i(或p+i)不是简单的在a(或p)表示的地址值上简单的加i,而是加上i个基类型所需的地址偏移量,即加上i*sizeof(int)l指针值可以改动,如p+为下一元素的地址l数组名的值不能修正,如a+是非法操作l指针指向某个数组元素l前提条件:p=a+i;l*(p+)与ai+等价l*(p-)与ai-等价l*(+p)与a+i等价l*(-p)与a-i等价l留意不能运用*(a+)或a=p+i这种方式l留意区分运算顺序,*(p+)与(*p)+l留意防止下标越界,留意掌握指针位置int a10
10、, i, *p;p = a;/* 指针需求先赋值指针需求先赋值 */while (pa+10) /* 指针在数组范围内挪动指针在数组范围内挪动 */ scanf(%d, p+); /* 指针向下挪动指针向下挪动 */p = a;/* 指针指向正确位置指针指向正确位置 */for (i=0; i10; i+) printf(%d, pi); /* 指针运用指针运用 */l数组元素用作函数实参l与同类型的普通变量用法一样l数组用作函数参数l数组类型可以作为函数参数类型l数组可以用作函数的形参和实参l定义函数时,数组型形参实践上作为指针型形参处置,实参可用一样类型的数组或指针l声明数组类型形参时,不
11、需求指定数组长度l普通应把数组长度作为另一个参数传送f(int x, int n) . . main() int a10; . . f(a, 10);l形参用数组名l实参用数组名l形参用指针变量l实参用数组名f(int *x, int n) . . main() int a10; . . f(a, 10);l形参用数组名l实参用指针变量l形参用指针变量l实参用指针变量f(int x, int n) . . main() int a10, *p=a; . . f(p, 10);f(int *x, int n) . . main() int a10, *p=a; . . f(p, 10);l选择排
12、序法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,xk=t; 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); /* 定义指针
13、变量定义指针变量 */ int a, b, c; scanf(%d%d, &a, &b); p = max; /* 用函数名赋值用函数名赋值 */ c = (*p)(a, b); /* c=max(a,b); */l一元函数定积分的梯形法数值求解2)()(2)()(11bfxfafhdxxfhiaxnabhniibaidouble 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; i
14、n; i+) s += (*f)(a+i*h); return s*h;#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); l函数的前往值可以是指针类型l定义方式l类型 *函数名(参数列表);l举例lint *foo(int x, int y);l阐明l函数调用可以结合运用*和运算符l留意与指向函数的指针区别
15、lint (*foo)(int x, int y);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 */int *f(int *a, int *b) /* 前往整型指针前往整型指针 */ return *a*b?a:b; /* 前往第一个元素前往第一个元素 */ /* 较大
16、的数组地址较大的数组地址 */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的元素的元素 */l指针数组l类型 *数组名长度;l元素是指针类型的数组l举例,char *p4;l留意与基类型为数组的指针区分lchar (*p)4;l指向指针的指针l基类型为指针类型的指针l举例,char *p;/* 把一切名字的一切字母全部改成大写把一切名字的一切字母全部改成大写 */void main() char *name=Tom, John, Kate; int i,
17、 j; for (i=0; i=a & nameij=z) nameij-=32;/* 利用指向字符指针的指针打印字符串数组利用指向字符指针的指针打印字符串数组 */void main() 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;l复杂类型变量的声明容易混淆l指针数组和指向数组的指针lint *a5; int (*a)5;l指向函数的指针和前往指针值的函数lvoid (*f)(); void *f();l过于复杂的声明方式使程序晦涩难懂,而且容易出错l可以用typedef关键字把复杂类型的变量声明用假设干个容易了解的小步骤表示l从标识符开场,逐层分析其意义l按运算符优先级和结合方向的顺序进展l能够涉及的运算符包括l()自左向右结合l改动结合顺序;或声明一个函数,向外一层是函数前往值类型声明l自左向右结合l声明一个数组,向外一层是数组元素类型声明l* 自右
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 九年级道德与法治下册第三单元走向未来的少年第七课从这里出发第2框走向未来练习题含解析新人教版
- 幼儿园绘本课题申报书
- 政务服务课题申报书
- 项目管理课程成果的评估指标研究试题及答案
- 市级课题申报评审书
- 项目管理中技术创新的推广方式试题及答案
- 2025至2030年中国游戏机单投币铁门数据监测研究报告
- 2025年中国平行轴斜齿减速机市场调查研究报告
- 2025年中国双头螺栓连接副市场调查研究报告
- 轮毂电机驱动底盘模块智造项目可行性研究报告模板-立项拿地
- 甲状旁腺功能减亢进的护理
- 蜜雪冰城员工管理制度
- (高清版)JTG 3370.1-2018 公路隧道设计规范 第一册 土建工程
- 《生理学》-血液循环-选择题(A型)
- 江苏省昆山、太仓、常熟、张家港市2023-2024学年下学期七年级数学期中试题
- 电气工程接地用铜覆钢技术条件
- 2.1碳排放与环境安全学案高中地理选择性必修三
- MOOC 大地测量学基础-南京信息工程大学 中国大学慕课答案
- 运输安保工作方案
- 《早期教育概论》课程标准
- 小学科学冀人版六年级下册全册同步练习含答案
评论
0/150
提交评论