第5讲嵌入式C语言存储器及指针.ppt
《第5讲嵌入式C语言存储器及指针.ppt》由会员分享,可在线阅读,更多相关《第5讲嵌入式C语言存储器及指针.ppt(30页珍藏版)》请在三一文库上搜索。
1、嵌入式C语言编程存储器及指针,GDAIB,Memory and Pointers,目录,指针与数组(Pointers and arrays) 函数指针(Function pointers) 内存陷阱(Memory pitfalls) 栈(Stacks),Page 2,指针与数组,C语言中只支持一维数组,且只支持静态数组。 数组的大小在编译的时候就必须作为一常数确定下来。 虽然C的数组只有一维,但是它的数组元素可以是任何数据类型的对象,因此一个数组的元素也可以是另外一个数组,这样就可以模拟出多维数组。 有关数组的操作即使是通过数组下标进行运算的,实际上都是通过指针进行的。,Page 3,多维数组
2、,看左边的几个声明,请思考: Calendar4 是什么意思?,Page 4,数组名与指针,int a10; int *p; p = a; a+; p+; printf(“The size of a is %dn”, sizeof(a); printf(“The size of p is %dn”, sizeof(p); ,/*语法错误!a是常量!*/,/*语法正确! p是变量!*/,/*对于大多数32位系统,输出的结果是40 */,/*输出的结果是4 */,请指出下列代码中的错误及输出结果?,Page 5,数组作为函数的入口参数,char b10=“123456789”; main( ) f
3、(b); void f(char a ) char c; a+; c = a0; printf(“The size of a is %dn”, sizeof(a); printf(“The size of b is %dn”, sizeof(b); ,void f(char *a) . ,/* a是指针,输出的结果是4*/,/*形参看起来是数组,实际已退化为指针*/,/*a是指针,因此自增运算是合法的!*/,/*a通过下标可以看起来像数组,但是它不是数组,而且此时c的值应该是”2”而不是”1”因为前面a做了自增运算*/,/* b是数组,输出的结果是10*/,/*真正传入f函数的是数组b的首地址
4、指针*/,请分析这个程序?,Page 6,字符串数组与指向字符串的指针, char *p = “hello world! ”; char a = “hello world!”; p0 = H; a0 = H; p = a; ,在很多编译器中可能是非法的,因为p所指向的串可能存放在只读的存储空间,比如ROM或Flash,P重新指向a,但p原来指向的串将永远丢失,因为不知道原来那个串存放内存的地方,Page 7,指出左边的程序段有何不妥?,指针与数组(Pointers and arrays) 函数指针(Function pointers) 内存陷阱(Memory pitfalls) 栈(Stack
5、s),Page 8,目录,函 数 指 针 定 义,int (*fp)(int); int *fp(int); int *(*fp_array10)(int); int *fp_array10(int);,声明一个函数指针变量fp,它指向一个入口参数与返回值都是整数的函数,声明一个函数fp(),该函数有一个整数参数,并且返回一个指向整数的指针,声明一个函数指针数组,它的每个元素都指向一个入口为整数且返回在值也为整数指针的函数,从运算符的结合性来看,为是一个函数数组,但C中没有这个概念,故这个声明有语错误!,Page 9,int *myfunction(int); int *(*fp)(int);
6、 int *ptr; fp = myfunction; ptr = (*fp)(3); ptr = fp(3);,函 数 指 针 调 用,/*为fp赋初值,使它指向函数myfunction*/,/*通过函数指针调用函数,与myfunction(3) 的效果一样*/,/*这也是通过函数指针调用函数,与myfunction(3) 的效果一样*/,Page 10,多态(Polymorphism) 指用一个名字定义不同的函数,这些函数不同但操作类似,从而实现“一个接口,多种方法” 回调(Call_Back) 指操作系统来调用用户编写的函数,或由底层函数调用上层函数 多线程(Multithreading
7、) 操作系统按一定的条件请允许多任务调度,则调用调度器选择合适的任务进行运行。,函 数 指 针 的 作 用,Page 11,指针与数组(Pointers and arrays) 函数指针(Function pointers) 内存陷阱(Memory pitfalls) 栈(Stacks),Page 12,目录,程序内存映像布局,1.静态映像(可执行文件): TEXT段、DATA段、BSS段; 2.动态映像(可执行文件运行): BSS段消失 增加堆和栈,Page 13,1. TEXT:保存指令代码、立即数等只读信息, 函数地址就在该段中分配 2. DATA:保存已初始化全局变量、静态变量。 其中
8、又分为RODATA,保存字符串常量等只读数据 3. BSS: 记录未初始化全局变量、静态变量的标号的内存大小, 程序运行后为这里数据在DATA段分配内存并初始化为0 4、堆(Heap):保存临时动态分配内存 5、栈(Stack):保存临时静态分配内存,内存映像定义,Page 14,变量内存分配方式,1、静态分配: 在程序执行时由系统自动分配,使用完毕后由系统自动回收 根据类型大小自动在数据段、栈分配静态内存 好处是不存在内存泄露问题,但静态分配的内存有限 2、动态分配: 需要在代码中手动分配,使用完毕后必须在代码中手动回收 根据运行时的要求在堆上分配动态内存 好处是能动态分配很大的内存,但一旦
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 嵌入式 语言 存储器 指针
链接地址:https://www.31doc.com/p-2120980.html