首页 嵌入式C编程01指针的使用

嵌入式C编程01指针的使用

举报
开通vip

嵌入式C编程01指针的使用指针的使用课程安排指针的概念指针数据类型指针与其他数据类型指针修饰符一般的32位CPU都有硬件MMU单元,能将有限的硬件内存(如512M)虚拟成一个较大(如2G)的虚拟内存这样软件可以在一个非常大的范围里使用内存每个内存单元(8bits组成一个内存单元byte)都有一个地址地址是一个无符号的整数表示,通常与CPU字长相等(在32位CPU上就是4byte的空间)内存与地址1、变量是对程序中数据存储空间(地址和值)的抽象intnum=100;printf(“numis%d,numaddris%p\n”,num,&num...

嵌入式C编程01指针的使用
指针的使用课程安排指针的概念指针数据类型指针与其他数据类型指针修饰符一般的32位CPU都有硬件MMU单元,能将有限的硬件内存(如512M)虚拟成一个较大(如2G)的虚拟内存这样软件可以在一个非常大的范围里使用内存每个内存单元(8bits组成一个内存单元byte)都有一个地址地址是一个无符号的整数 关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf 示,通常与CPU字长相等(在32位CPU上就是4byte的空间)内存与地址1、变量是对程序中数据存储空间(地址和值)的抽象intnum=100;printf(“numis%d,numaddris%p\n”,num,&num);2、可以将变量的地址保存在一个整型变量中unsignedintaddr=0;addr=#printf(“addris%#x\n”,addr);3、问题是,怎么通过addr简接获取该地址内保存的值(100)?变量与地址1、C定义了一种专门用于表示地址的变量—指针int*addr;//定义指针变量2、将内存中数据的地址赋值给指针变量:表示将指针指向该数据addr=#//指针变量addr指向num变量3、通过指针变量可以间接访问被指向的数据printf(“numis%d\n”,*addr);//通过addr获取num*addr=200;//通过addr修改numprintf(“numis%d\n”,num);指针的由来用好指针可以:使程序简洁、紧凑、高效有效地表示复杂的数据结构动态分配内存得到多于一个的函数返回值直接操作地址造就了C/C++的强大用不好指针造成:非法内存访问,程序死机或异常内存泄露,减低系统性能指针属于间接访问,指来指去最终变得不可维护指针是把双刃剑课程安排指针的概念指针数据类型指针与其他数据类型指针修饰符指针的定义实例:int*pi;char*pc;double*pd;info_t*pinfo;staticint*pi;staticchar*pc;staticinfo_t*pinfo;关键概念:1、指针类型与指针指向对象类型2、指针的值与指针指向对象的值指针内存大小指针变量用来表示内存地址,32位CPU上用4byte空间表示地址int*pi;char*pc;double*pd;info_t*pinfo;sizeof(pi)=?sizeof(pc)=?sizeof(pd)=?sizeof(pinfo)=?指针初始化与赋值1、初始化为指向对象的地址intnum=100;intpaddr=#//paddr指向num2、初始化为空指针int*paddr=NULL;//NULL为0,表示空地址3、指针变量定义后可以随时改变所指向的变量intnum1=100,num2=200;intpaddr=NULL;paddr=&num1;paddr=&num2;指针运算1、取值运算符intnum=100;int*paddr=#通过paddr间接取num值:*paddr2、取址运算符&paddr=?:表示paddr这个指针变量的地址3、加减运算:偏移指针类型字节数paddr+1=?paddr++?paddr–1=?paddr--?4、强制转换intnum=100;char*paddr=#*paddr=?paddr+1=?*(int*)paddr=?(int*)paddr+1=?通用(void)指针指针变量的类型表示指针所指向对象的类型能不能定义一种通用指针,将来根据需要再指向特定对象?void*point=NULL;//void指针,定义不指定指针指向哪种类型数据sizeof(point)=?point++?point--?使用时需要进行强制类型转换:intnum=100;charch=‘a’;void*point=NULL;point=#printf(“numis%d\n”,*(int*)point);point=&ch;printf(“chis%c\n”,*(char*)ch);课程安排指针的概念指针数据类型指针与其他数据类型指针修饰符数组与指针1、数组与指针的关系数组名表示数组首地址,可以把数组名可作指针常量intarr[3]={1,2,3};int*p=arr;p++?arr++?*p=?*(p+1)=?*(p+2)=?数组下标操作符内部实现机制:通过指针取值运算符实现arr[2]相当于*(arr+2)数组作为函数参数,实际是转化为指针实现str_cpy(charsrc[],chardes[])=>str_cpy(char*src,char*des)数组作为函数返回值,必须通过指针实现char*str_cpy(char*src,char*des)数组与指针2、指针数组:即数组的元素为指针类型。char*var[10];//10个int型指针的数组sizeof(var)=?var+1?3、数组指针:即指针的类型为数组(指向数组的指针)。char(*var)[10];//指向10个int型数组的指针sizeof(var)=?var+1?4、字符串与指针字符串是属于典型的字符数组,因而通常通过char型指针处理字符串数组与指针将字符串直接赋值给指针,表示指针指向字符串内存首地址注意:字符串常量内存分配在只读数据区(RODATA)实例:char*p=“xnf”;chararr[]={“xnf”};*p?*p++?*++p?*p=‘X’?arr[0]=‘X’?strcpy(p,“XNF”)?strcpy(arr,“XNF”)?数组与指针通过指针数组表示字符串数组chara[][16]={“welcome”,“to”,“xnf”};主函数参数就是通过指针数组实现的:intmain(intargc,char*argv[])结构与指针1、结构包含指针:结构体中包含指针域变量如:学生信息中name与phone定义为指针注意:在程序中动态修改学生信息表中的name和phone域可行么?结构与指针2、指向结构体的指针结构体变量域通过.访问,而结构体指针域通过->访问sizeof(info)=?sizeof(p)=?下面这段代码错在哪里?结构与指针通过结构体指针传递参数比直接传递结构体变量更高效实参传递给形参时只拷贝了4个字节指针与指针1、指向指针变量的指针intnum=100;int*p=#int**pp=&p;实现指针二级访问:函数与指针1、指针作为函数的参数向函数传递数组、字符串、结构:如strc_py、show_info作为函数的输出参数例如:实现交换两个整数的函数voidswap(inta,intb)传值,形参值改变并不能带回给实参传址,在函数内改变地址内保存的内容函数与指针问题:要在函数能改变指针的值,怎么通过输出参数返回?例如:voidget_mem(char*pmem,intsize){pmem=malloc(size);}动态分配的内存能通过pmem带回么?不能!要将实参指针的地址传递给形参(二级指针)才能实现!更直接的 方法 快递客服问题件处理详细方法山木方法pdf计算方法pdf华与华方法下载八字理论方法下载 是通过函数返回值实现函数与指针2、指针作为函数的返回值返回字符串、动态分配的内存等,如*strcpy,*malloc注意返回地址的有效性(函数执行完毕后该地址未被回收)下面两个函数哪个是合法的?函数与指针3、指向函数的指针函数存放在TEXT段,同样具有地址函数名就是函数在TEXT段的入口地址跟数组名一样,函数名也可以看作是一个指针常量所以,函数名也可以赋值给指针变量,那么该指针变量类型呢?函数指针类型!通过函数指针,也可以间接调用函数。函数与指针函数指针的应用:1、作为函数参数实现回调函数所谓回调函数是指通过调用其他函数反过来调用某个函数模拟面向对象的多态,在UI组件的大量使用函数与指针2、作为结构体的动作域模拟面向对象的类,在Linux内核中大量使用作为一个现实中的对象,不但有数据属性,还需要有行为属性使用对象行为课程安排指针的概念指针数据类型指针与其他数据类型指针修饰符const修饰符1、const修饰符的作用:限定一个变量不允许被改变(只读)如:constintnum=100;//num是只读整型变量constintarr[3]={10,20,30};//arr是只读整型数组num=200?arr[0]=100?arr[1]=200?2、const指针:指向变量的只读指针,指针本身只读,但指向的对象非只读如:intnum1=100;intnum2=200;int*constp=&num1;*p=200?p=&num2?const修饰符3、指向const变量的指针:指向只读变量的指针,而指针本身不是只读的如:constintnum1=100;constintnum2=200;constint*p=&num1;*p=200?p=&num2?注意:const也可以在int之后,如intconstnum1=100;intconst*p=&num14、指向const变量的const指针:指针和指向的变量都是只读的如:constintnum1=100;constintnum2=200;constint*constp=&num1;*p=200?p=&num2?volatile修饰符1、编译器总是试图优化编译使代码运行得更快如果程序中变量未被改变,对变量的访问尽量用寄存器代替内存储存寄存器属于CPU内部的存储单元,比起内存访问来得更快2、但对于硬件驱动程序来说,这样做就存在风险constunsignedint*paddr=0x0012ff7c;//假定0x0012ff7c表示一个网卡内存地址data=*paddr;//第一次取网卡数据data=*paddr;//第二次取网卡数据由于*paddr从未被程序改变,所以第二次取值从寄存器中进行,跟第一次值一样但网卡内存数据会随时在通信中发生改变!volatile修饰符3、使用volatile修饰符volatile告诉编译器,不要对其修饰的变量作优化总是从内存进行读写,而不是仅仅在寄存器volatileconstunsignedint*p=0x0012ff7c;//假定0x0012ff7c表示一个网卡内存地址typedef修饰符1、指针相关数据类型定义含义inti;int*p;inta[n];int*p[n];int(*p)[n];intf();int*p();int(*p)();int**p;定义整型变量ip为指向整型数据的指针变量定义含n个元素的整型数组an个指向整型数据的指针变量组成的指针数组pp为指向含n个元素的一维整型数组的指针变量f为返回整型数的函数p为返回指针的函数,该指针指向一个整型数据p为指向函数的指针变量,该函数返回整型数p为指针变量,它指向一个指向整型数据的指针变量typedef修饰符2、更复杂的指针相关数据类型从变量名括号开始解释,括号外面表示类型可以用typedef自定义类型来简化int(*p[3])(int);typedefint(func_t)(int);//定义返回整数的函数类型funct_t*p[3];//定义包含3个函数指针的数组int*(*p[3])(int);typedefint*(func_t)(int);//定义返回整数指针的函数类型func_t*p[3];//定义包含3个函数指针的数组typedef修饰符int(*p)[3](int);//错误,不能声明函数的数组如何定义指向包含3个返回整数函数指针数组的指针?typedefint(func_t)(int);//定义返回整型函数指针类型typedeffunc_t*pfarr_t[3];//定义包含3个函数指针数组类型pfarr_t*p;//定义指向数组的指针上机实验1、指针应用(1)用指针实现char*str_cpy(char*des,char*src)voidset_info(info_t*pinfo)函数(2)封装获取动态内存函数get_mem,分别通过返回值和输出参数带回内存分配结果2、函数指针使用在学生信息info_t中增加reading读书行为,并通过回调函数调用reading3、指针数据表示(1)如果显卡内存地址是0x345ff000(假定),用指针表示并模拟读写显卡操作(2)解释void(*var[10])(void(*)(void)),并通过typedef简化表示
本文档为【嵌入式C编程01指针的使用】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
机构认证用户
希望图文
公司秉着用户至上的原则服务好每一位客户,专注课件、范文、教案设计制作
格式:ppt
大小:1MB
软件:PowerPoint
页数:36
分类:其他高等教育
上传时间:2022-05-06
浏览量:0