哈工大C语言05PointerAndArray

上传人:宝路 文档编号:48177869 上传时间:2018-07-11 格式:PPT 页数:35 大小:383.64KB
返回 下载 相关 举报
哈工大C语言05PointerAndArray_第1页
第1页 / 共35页
哈工大C语言05PointerAndArray_第2页
第2页 / 共35页
哈工大C语言05PointerAndArray_第3页
第3页 / 共35页
哈工大C语言05PointerAndArray_第4页
第4页 / 共35页
哈工大C语言05PointerAndArray_第5页
第5页 / 共35页
点击查看更多>>
资源描述

《哈工大C语言05PointerAndArray》由会员分享,可在线阅读,更多相关《哈工大C语言05PointerAndArray(35页珍藏版)》请在金锄头文库上搜索。

1、C程序设计语言第5章 指针与数组孙志岗 http:/*1Pointers and Arrays*2计算机内的存储部件,活动中的所有指令和数 据都保存在内存内速度快,但是掉电即失可以随机访问 只要指名要访问的内存单元的地址,就可以立即访 问到该单元 地址是一个无符号整数(通常用16进制数),其字 长与主机相同 内存中的每个字节都有唯一的一个地址内存(Random Access Memory) 地址(Address)*3指针的故事“该程序执行了非法操作,即将关闭” 这种错误几乎全是由指针和数组导致的黑客攻击服务器利用的bug绝大部分都是指针 和数组造成的有些非计算机专业的人,尽量避免使用指针*4

2、指针的故事铁杆C/C+程序员最挚爱的武器:指针指针造就了C/C+的高效和强大很多不可能的任务由指针完成 main()char*a=“main()char*a=%c%s%c; printf(a,34,a,34);“;printf(a,34,a,3 4);*5关于指针的原则学习原则 一定要学会 其实通常的应用很简单就是一个变量 复杂的应用也不建议使用使用原则 永远要清楚每个指针指向了哪里 永远要清楚指针指向的位置是什么*6数组(Array)若干类型相同的相关数据凑到一起,就是数组定义 类型 数组名整型常数1整型常数2 整型 常数n; int a64;使用 a00、a12、a53 每个元素都是一个普

3、通变量 下标可以是任意整型表达式数组的各个元素在内存中分布在一起,分布规 律是array.c思考一下一维和三维数组怎么分布呢?*7从类型的角度理解数组int a10; 定义了一个有10个int类型元素的数组 a的类型可以看作int10(只是看作,语法并不允许这么 定义: int10 a)int a2010; 定义了一个有20个int10类型元素数组 a0、 a1a9的类型是int10,所以a00 、 a01a199的类型是intint a302010; 这个呢?这种特性决定了数组元素在内存的分布规律,也解释 了数组的很多语法现象*8数组初始化数组定义后的初值仍然是随机数,一般需要我 们来初始化

4、int a5 = 12, 34, 56 ,78 ,9 ;int a5 = 0 ;int a = 11, 22, 33, 44, 55 ;数组大小最好用宏来定义,以适应未来可能的 变化 #define SIZE 10 int aSIZE;*9数组的使用数组的下标都是从0开始对数组每个元素的使用与普通变量无异可以用任意表达式作为下标,动态决定访问哪个元素 for (i=0; i 和中均定义了下面的函数void* malloc(size_t size); size_t是在中定义的数据类型,就是一个 unsigned int 向系统申请大小为size的内存块,把指向首地址的指针返回 。如果申请不成功,

5、返回NULLvoid free(void* block); 释放由malloc()申请的内存块。block是指向此块的指针malloc申请的内存,在被free之前,程序的任何部分都 可以使用 当然,要使用必须得到指向它的指针*26动态分配内存如果malloc()申请的内存不被free()程序 就退出,将产生内存泄露(Memory Leak) “内存泄露”一词类似“原料泄露”。泄露出去的原料 不能被利用,导致生产过程中原料不足 malloc()时,系统找到一块未占用的内存,将其 标记为已占用,然后把地址返回,表明此程序占用 此块内存,其它程序不能再用它 free()时,系统标记此块内存为未占用,

6、本程序 不能继续使用,所有程序可以申请使用 如果malloc()之后不free(),此块内存将永远 不会被任何程序使用,就好像这块内存泄露出去一 样*27防止内存泄露之道在需要的时候才malloc,并尽量减少malloc的次数 能用自动变量解决的问题,就不要用malloc来解决 malloc一般在大块内存分配和动态内存分配时使用 malloc本身的执行效率就不高,所以过多的malloc会使程序 性能下降可以重复利用malloc申请到的内存尽量让malloc和与之配套的free在一个函数内 尽量把malloc集中在函数的入口处,free集中在函数的出口处以上做法只能尽量降低产生泄露的概率。完全杜

7、绝内 存泄露,关键要靠程序员的细心与责任感*28字符串(String) 与字符数组、字符指针字符串 一串以0结尾的字符在C语言中被看作字符串 用双引号括起的一串字符是字符串常量,C语言自动为其添加0终结符“Hello world!“把字符串常量作为表达式直接使用,得到的值是该常量的地址 C语言并没有为字符串提供任何专门的表示法,完全使用字 符数组和字符指针来处理 字符数组 每个元素都是字符类型的数组 char string100;字符指针 指向字符类型的指针 char* p;数组和指针可以等同看待,上面三者本质上是一回事*29字符串处理函数在中定义了若干专门的字符串处理函数strcpy: st

8、ring copy char *strcpy(char *dest, const char *src);strlen: string length size_t strlen(const char *s);strcat: string combination char *strcat(char *dest, const char *src);strcmp: string comparison int strcmp(const char *s1, const char *s2);stricmp: string comparison ignoring case int stricmp(const

9、char *s1, const char *s2);*300作为字符串终结符的天生缺陷假若交给这些字符串处理函数的字符串没有 0会如何?0很关键,如果没有,那么这些处理函数 会一直进行处理直到遇到一个0为止。此 时可能已经把内存弄得乱七八糟ANSI C定义了一些“n族”字符处理函数,包括 strncpy、strncat、strncmp、 strnicmp等,通过增加一个参数来限制处理 的最大长度*31指针、数组以及其它的类型混合基本数据类型 int、long、char、short、float、 double指针是一种数据类型 是从其它类型派生的类型 XX类型的指针数组也是一种数据类型 是从其它

10、类型派生的类型每个元素都有一个类型任何类型都可以做指针或者数组的基础类型 它们自己也可以做彼此或自己的基础类型*32命令行参数通过命令行参数,使用户可以根据需要来决定 我们的程序干什么、怎么干main(int argc, char* argv) 当你把main函数写成这样时 argc的值为程序执行时参数的数目(包括命令本 身) argvX为指向每个参数的字符指针*33指向函数的指针int (*pfunc) (int, int) 定义了一个函数指针pfunc,它指向的函数必须是 :返回值为int类型,有两个int类型的参数int f1(int a, int b); int f2(int x, i

11、nt y); pfunc = f1; (*pfunc)(1, 2); pfunc = f2; (*pfunc)(1, 2);*34qsortvoid qsort(void *base,size_t nelem,size_t width,int(*fcmp)(const void *,const void *); 定义在中 用“快速排序”算法对base所指向的数据进行排序。每个数据 占width个字节,共有nelem个 fcmp是指向用户自己定义的函数的指针该函数通过两个参数得到两个值。如果第一个值大于第二个,返回大于0的数;如果两个值相等,返回0;否则,返回小于0 的数qsort会调用fcmp进行元素的比较,并最终排序 这种方法在程序设计学中被称为“函数回调”。被“回调”的函数称为“回调函数”*35使用指针与数组的万灵丹指针变量是一种变量 特别1:可以对此变量进行*操作 特别2:此变量的加减法有些特殊数组成员是一种变量指针是一种数据类型数组是一种数据类型数组名也是指针 一旦有了确切的指向,就不能再修改指针也是数组名对它们,只要按照变量和类型的一般原则使用就可以 ,没有多少特殊化的地方

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

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