C语言_ch08_1_指针和指针变量、指针作为函数参数.ppt

C语言_ch08_1_指针和指针变量、指针作为函数参数.ppt

ID:51488535

大小:691.63 KB

页数:29页

时间:2020-03-24

上传者:asd881529
C语言_ch08_1_指针和指针变量、指针作为函数参数.ppt_第1页
C语言_ch08_1_指针和指针变量、指针作为函数参数.ppt_第2页
C语言_ch08_1_指针和指针变量、指针作为函数参数.ppt_第3页
C语言_ch08_1_指针和指针变量、指针作为函数参数.ppt_第4页
C语言_ch08_1_指针和指针变量、指针作为函数参数.ppt_第5页
资源描述:

《C语言_ch08_1_指针和指针变量、指针作为函数参数.ppt》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

2021/7/221上一节我们学到了作用域和生存期内存分配static关键字的两种作用静态局部变量静态全局变量定义和声明的区别定义:只一次、确定类型并分配内存,创建新对象声明:可多次、不分配内存,不创建新对象,只是描述其他地方创建的对象 2021/7/222第8章善于利用指针8.1指针是什么8.2指针变量8.3通过指针引用数组8.4通过指针引用字符串8.5指向函数的指针8.6返回指针值的函数8.7指针数组和多重指针8.8动态内存分配与指向它的指针变量8.9有关指针的小结 2021/7/223计算机内的存储部件,活动中的指令和多数数据都保存在内存内;速度快,但是掉电即失;内存中的每个字节都有唯一的一个地址;地址是一个无符号整数(通常用16进制数),其长度与机器字长相同内存(RandomAccessMemory) 地址(Address) 2021/7/224指针的故事指针造就了C/C++的高效和强大很多不可能的任务由指针完成输出自身的源代码intmain(){char*a="intmain(){char*a=%c%s%c;printf(a,34,a,34);return0;}";printf(a,34,a,34);return0;} 2021/7/225指针的故事"该程序执行了非法操作,即将关闭"这种错误几乎全是由指针和数组导致的黑客攻击服务器利用的bug绝大部分都是指针和数组造成的尽量避免使用指针 2021/7/226关于指针的原则学习原则掌握其实通常的应用很简单就是一个变量复杂的应用也不建议使用使用原则永远要清楚每个指针指向了哪里 区分"指针"和"指针变量"我们通常说,某地址"指向"某变量单元。因此在C语言中,将地址形象化地称为"指针"(pointer)。一个变量的地址称为该变量的“指针”。例如,地址0x0012ff40是变量i的指针(地址)。专门用来存放指针(即地址)的变量,称为"指针变量"。指针变量的值是指针(地址)。区分"指针"和"指针变量",可以类比"整型数据"和"整型变量"。0x0012ff440x0012ff40inti=0;int*pi=&i;pii 2021/7/228指针(Pointer)的定义int*p;定义了一个指向int的指针变量p,简称指针pdouble*pd;char*pc;混淆的原因 2021/7/229int*p还是int*pint*p;int*p;哪个好?int*b,c,d;b、c、d各是什么类型?b:int*c:intd:intint*b,*c,*d;//选择这个 2021/7/2210指针的赋值请牢记:指针变量中只能存放地址(指针)。下面的赋值是不合法的:int*pScore=100;地址为100的内存是OS内核区,不能存取int*指针必须指向int型数据inti;int*p; p=&i;doubled;double*p=&d;inti=0;int*pi=&i; 2021/7/2211指针变量类型指向不同数据类型的指针,分别为不同的数据类型int*、float*、char*、int**、int***……void*类型的指针可以指向任意类型的变量 指针变量的大小int*p;sizeof(int*)sizeof(p)double*pd;sizeof(double*)?sizeof(pd)?char*pc;sizeof(char*)sizeof(pc)所有类型的指针变量都占4个字节2021/7/2212 2021/7/2213&与*运算符&:取地址运算符inti,*p; p=&i;int*p,a[10]; p=a;int*p,a[10]; p=&a[0];double*p,a[10]; p=&a[5];*:指针运算符,取得指针指向的变量值inti,*p; p=&i; *p=0;printf(“%d”,*p);int*p,a[10]; p=a; *p=0;int*p,a[10]; p=&a[5]; *p=5;printf(“%d”,*p);inti=0;printf(“%d”,*&i); 2021/7/2214数组名到底是什么inta[10];数组名a就是"指向数组首元素的常量指针""常量"意味着不能修改数组名还隐含着数组的属性,即数组的长度和每个元素的类型,编译器是可以获得这些属性的a不同于&a[0],sizeof(a),sizeof(&a[0])?除了数组名被用作运算符sizeof的参数这一情形,在其他所有的情形中数组名都代表指向数组首元素的指针。-----《C陷阱与缺陷》 2021/7/2215常见错误1:引用未初始化的指针int*p;...*p=12;程序在执行这个赋值操作的时候,会发生什么情况呢? 2021/7/2216NULL指针NULL指针,即空指针,表示什么都不指向。指针怎么初始化?如果你已经知道指针将被初始化为某个地址,将他初始化为该地址,否则初始化为NULL。int*p=NULL;指针如何解引用?风格良好的程序会在指针解引用之前对它进行检查,这种初始化策略可以节省大量的调试时间。if(p!=NULL)*p=12; 2021/7/2217例8.1通过指针变量访问整型变量intmain(){inta=100,b=10;int*pointer_1=&a,*pointer_2=&b;printf("%d,%d ",a,b);printf("%d,%d ",*pointer_1,*pointer_2);}运行结果为:100,10100,10 2021/7/2218如何输出指针值?这段程序的输出?inti=0;int*p=&i; printf("*p:%d ",*p); printf("p:%p ",p); printf("p:%x ",p);*p:0p:0012FF44p:12FF44 常见错误2:使用已释放的内存int*myFunc(){intphantom=4;return&phantom;}intmain(){int*p;p=myFunc();printf(“%d”,*p);}这段程序正确吗?19 2021/7/2220指针与函数指针可以做为函数的参数和返回值的类型指针做参数的经典例子:intmain() {intx=1,y=2; swap(x,y);printf("%d%d ",x,y); }voidswap(intx,inty) {inttemp; temp=x; x=y; y=temp; }NotWork 2021/7/2221指针做参数intmain() {intx=1,y=2; swap(&x,&y);printf("%d%d ",x,y);}voidswap(int*px,int*py) {inttemp; temp=*px; *px=*py; *py=temp; }这里的函数调用过程还是"实参"的内容复制到"形参",C语言中所有的传递都是按值传递 2021/7/2222swap函数的几种错误形式(1/3)voidswap(intx,inty){inttemp;temp=x;/*形参x,y为局部变量*/x=y;y=temp;}参数单向传递 2021/7/2223swap函数的几种错误形式(2/3)voidswap(int*p1,int*p2){int*p;*p=*p1;*p1=*p2;*p2=*p;}指针p未初始化,没有确切地址,所指向的单元是不可预见的 2021/7/2224swap函数的几种错误形式(3/3)voidswap(int*p1,int*p2){int*p;p=p1;p1=p2;p2=p;}参数单向传递 习题已知main函数如下,请写出squareByPtr函数的定义voidsquareByPtr(int*numPtr){*numPtr=*numPtr**numPtr;}intmain(){intx=5;squareByPtr(&x);printf("%d ",x);//Prints25}2021/7/2225 2021/7/2226三个月使用scanf目睹之怪现状inti; scanf("%d",i);/*这样会如何?*/inti; scanf("%f",&i);/*这样又会如何?*/charc; scanf("%d",&c);/*这样呢?*/i的值被当作地址。例如,i的值如果是100,那么输入的整数就会写入从地址100开始的内存输入被当作float,以float的二进制形式写到i所在的内存空间输入以int的二进制形式写到c所在的内存空间。c所占内存不足以放下一个int,其后的空间也被覆盖 习题以下对指针p的操作正确的是()A.inta[5],*p;p=&a;B.inta[5],*p;p=a;C.inta[5];int*p=a[5];D.inta[5];int*p,p2=a;*p=*p2;B 2021/7/2228周日(11月11日)实验 2021/7/2229回忆变量的存取过程当我们在代码中引用一个变量名时,计算机的两步工作:1.查找变量名对应的地址2.到该内存位置取值或设置值例如,inti=0;printf("%d",i);请务必弄清楚一个内存单元的地址与内存单元的内容这两个概念的区别

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。
关闭