




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1C的数据类型: 基本类(简单类)字符型/整型/实型/枚举型构造(guzo)类(组合类)数组/结构体/共用体指针类空类型(void)第1页/共65页第一页,共66页。21.内存地址2.寻址方式(fngsh)整型变量(binling)i.2000200420062005200120022003地址(dzh)10与指针相关的概念与问题第2页/共65页第二页,共66页。3内存是计算机内的存储部件,所有指令和数据都保存在内存内速度快,但是掉电即失可以(ky)随机访问只要指名要访问的内存单元的地址,就可以(ky)立即访问到该单元地址是一个无符号整数,其字长一般与主机相同内存中的每个字节都有唯一的一个地址
2、地址按字节编号,按类型分配空间内存地址返回(fnhu)第3页/共65页第三页,共66页。4如何读写内存中的数据?通过变量的地址访问变量所在的存储单元(cn ch dn yun)两种寻址方式 (1)直接(寻址)访问直接按变量地址来存取变量内容的访问方式 (2)间接(寻址)访问通过指针变量来间接存取它所指向的变量的访问方式 寻址方式(fngsh).2000200420062002101214a的首地址(dzh)2000 a的首地址Pa*P第4页/共65页第四页,共66页。5指针(zhzhn)(Pointer)的概念指针是C语言提供的一种数据(shj)类型,它只存放地址型的数据(shj)指针变量 专
3、门存放地址型数据(shj)的变量 变量的指针 变量的地址指针(zhzhn)的使用原则先定义,后使用永远要清楚每个指针(zhzhn)指向了哪里永远要清楚指针(zhzhn)指向的位置是什么第5页/共65页第五页,共66页。6指针变量(binling)的定义指针变量定义的一般形式(xngsh): 类型关键字 *指针变量名例: int *p;定义了一个指针变量p,简称指针pP里保存一个地址(dzh)。此时这个地址(dzh)是哪呢(p指向哪呢)?&a指针P*P变量a&a第6页/共65页第六页,共66页。7定义指针(zhzhn)变量注意以下问题 (1)变量前面(qin mian)的“*”不
4、能省略。 int *ptr1,ptr2;如:(2)指针变量只能指向(zh xin)定义时所规定类型的变量。 (3)引用指针变量前,必须让它指向一个变量。第7页/共65页第七页,共66页。8判断(pndun)对错? int i,*p;p=&i; int *p;float *q;p=q;int i;float *p;p=&i;int *p;p=100;指针变量只存放(cnfng)地址!一个指针变量(binling)不能指向与其类型不同的变量(binling)!应在类型相同的指针变量之间赋值第8页/共65页第八页,共66页。9&与*操作符 &用来取变量(binling
5、)的地址int i, *p;p = &i;int *p, a10;p = a;int *p, a10;p = &a0;int *p, a10;p = &a5;*用来取指针指向地址(dzh)的内容int i, *p;p = &i;*p = 0;int *p, a10;p = a;*p = 0;int *p, a10;p = &a0;*p = 0;int *p, a10;p = &a5;*p = 0;第9页/共65页第九页,共66页。10指针(zhzhn)的指向 指针(zhzhn)指向非其定义时声明的数据类型,将引起warningVoid *类型的指
6、针可以指向(zh xin)任意类型的变量指针在初始化时一般常用 *p=NULL; NULL表示空指针,即无效指针 但它只是逻辑上无效,并不是真正地无效 避免指针变量非法引用如果指针指向一个非你控制的内存空间,并对该空间进行访问,将可能造成危险int i;float *p;p=&i;使用时强制类型转换例 char *p1; void *p2; p1=(char *)p2;第10页/共65页第十页,共66页。11例 main( ) int i=10; int *p; *p=i; printf(%d,*p); 危险(wixin)!例 main( ) int i=10; int *p; p=&
7、amp;i; *p=20; printf(%d,*p); 指针变量p.2000200420062005整型变量i10200120022003随机第11页/共65页第十一页,共66页。12指针与其它(qt)类型变量的对比 共性在内存中占据一定大小的存储单元先定义,后使用特殊性它的内容只能是地址,而不能是数据必须初始化后才能使用,否则指向不确定的存储单元只能指向同一基类型的变量可参与(cny)的运算:加、减一个整数,自增、自减、关系、赋值第12页/共65页第十二页,共66页。13指针(zhzhn)运算(1) 算术运算 int *p, a10; p = a; p+; /*p的值增加(zngji)多少
8、?*/6000600160026003600460056006pp+1指针的加减(ji jin)运算是以其指向的类型的字长为单位的第13页/共65页第十三页,共66页。14指针(zhzhn)运算(2) int *p, *q, a10;p = a;q = &a5;q p 其值为5,代表(dibio)差5个int字长q = p + 3;指针运算不能乱算一般只进行指针和整数的加减运算,同类型指针之间的减法(jinf)运算其它运算,比如乘法、除法、浮点运算、指针之间的加法等,并无意义,所以也不支持第14页/共65页第十四页,共66页。15指针(zhzhn)运算(3) 关系运算(1)只有指向同一
9、种数据类型的两个指针才能进行关系运算,值为1或0 p q p q p = q(2)指针不与非指针量进行比较,但可与NULL(即0值)进行等或不等的关系运算,判断(pndun)p是否为空指针 P = NULL p != NULL第15页/共65页第十五页,共66页。16赋值运算指针在使用前一定要赋值为指针变量赋的值必须(bx)是一个地址main() int *p; scanf(%d,p); 指针(zhzhn)运算(4) 第16页/共65页第十六页,共66页。17指针(zhzhn)与函数 指针既然是数据类型,自然可以做函数的参数和返回值的类型指针做参数的经典(jngdin)例子:两数的互换第17页
10、/共65页第十七页,共66页。18例7.1:编写函数(hnsh)实现两数的互换void Swap(int *x,int *y) int temp; temp = *x; *x = *y; *y = temp;main() int a, b; a = 15; b = 8; Swap( &a, &b ); printf(a=%d,b=%d,a,b);void Swap(int x,int y) int temp; temp = x; x = y; y = temp;main() int a, b; a = 15; b = 8; Swap(a, b); printf( a=%d,b=
11、%d ,a,b);程序(chngx) 1程序(chngx) 2 主调函数被调函数实 参形 参第18页/共65页第十八页,共66页。19主调(zh dio)函数被调函数(hnsh)1515ab实 参形 参88xyabxy没互换第19页/共65页第十九页,共66页。20简单(jindn)变量作函数参数图7-1 Swap函数调用前后(qinhu)参数变化的示意图c) 从Swap函数(hnsh)返回y 15815(b)执行Swap函数158a) 调用Swap函数temp xy Swap函数158main函数atempx81515tempxy b158158aabb第20页/共65页第二十页,共66页。
12、21主调(zh dio)函数被调函数(hnsh)&a&a实 参形 参&b&bxyabxy15 ab8互换第21页/共65页第二十一页,共66页。22指针(zhzhn)变量作函数参数图7-2 用指针变量作函数参数实现(shxin)两数互换函数的示意图1588&a&b&a(a) 调用Swap函数 a a b *x *x *y y x x &a &b main函数 Swap函数 temp15&b15(b) 执行Swap函数 b *y y temp第22页/共65页第二十二页,共66页。23swap函数的几种(j zhn)
13、错误形式(1/3)参数单向传递(chund)void Swap(int x, int y) int temp; temp = x; /* x,y为内部变量 */ x = y; y = temp;第23页/共65页第二十三页,共66页。24参数单向传递(chund)void Swap(int *p1, int *p2) int *p; p = p1; /* p1,p2为内部变量 */ p1 = p2; p2 = p; swap函数的几种错误(cuw)形式(2/3)第24页/共65页第二十四页,共66页。25指针p没有(mi yu)确切地址void Swap(int *p1, int *p2) i
14、nt *p; /* 指针p未初始化 */ *p = *p1; *p1 = *p2; *p2 = *p; swap函数(hnsh)的几种错误形式(3/3)第25页/共65页第二十五页,共66页。26例7.3 打印(d yn)出最高分及其学号 #include #define SIZE 10void FindMax(float score, long num, int n, float *pMaxScore, long *pMaxNum)main() float scoreSIZE, maxScore;int i;long numSIZE, maxNum;printf(Please enter t
15、he number and score:n);for(i=0; iSIZE; i+) scanf(%ld%f, &numi, &scorei); FindMax(score, num, SIZE, & maxScore, &maxNum); printf(maxScore = %f, maxNum = %ldn, maxScore, maxNum); 第26页/共65页第二十六页,共66页。27例7.3 打印(d yn)出最高分及其学号void FindMax(float score, long num, int n, float *pMaxScore, lon
16、g *pMaxNum) int i;*pMaxScore = score0; *pMaxNum = num0; for (i=1; i *pMaxScore) *pMaxScore = scorei; *pMaxNum = numi; maxScoremaxNum&maxScorepMaxScore&maxNumpMaxNumscore0num0第27页/共65页第二十七页,共66页。28字符(z f)串一串以0结尾的字符(z f)在C语言中被看作字符(z f)串用双引号括起的一串字符(z f)是字符(z f)串常量,C语言自动为其添加0终结符C语言并没有为字符(z f)串提供
17、任何专门的表示法,完全使用字符(z f)数组和字符(z f)指针来处理字符(z f)数组每个元素都是字符(z f)类型的数组char string100;字符(z f)指针指向字符(z f)类型的指针Char *p;数组和指针可以等同看待第28页/共65页第二十八页,共66页。29字符指针(zhzhn)变量与字符数组的区别定义方法不同 char str10; char *ptr;赋值方法和含义不同 char str10; str = ”china”; /*错误(cuw)*/ strcpy(str,”china”); /*正确*/ char *ptr; ptr = ”china”; /*正确*/
18、第29页/共65页第二十九页,共66页。30字符(z f)指针变量与字符(z f)数组的区别在定义一个数组时,在编译时即分配单元,有确定地址(dzh),而定义一个字符指针变量时,如未对它赋初值,则其所指数据是不定的,因而使用是危险的。 例如,输入字符串时 char str10; scanf(%s, str); /*正确*/ char *a; scanf(%s, a); /*错误*/ 应为: char *a; char str10; a = str; scanf(%s, a); /*正确*/第30页/共65页第三十页,共66页。31字符指针(zhzhn)变量与字符数组的区别初始化含义不同(b t
19、n) char *pstr = ”china”; 等价于 char *pstr; pstr = ”china”; char str14 = ”china”;不等价于 char str14; str = ”china”;字符指针是变量,而数组名是地址常量第31页/共65页第三十一页,共66页。32例7.5 字符串拷贝(kobi)方法1:用字符数组编程实现 /*函数功能: 字符串拷贝 函数参数: 字符型数组srcStr,存储(cn ch)源字符串 字符型数组dstStr,存储(cn ch)目的字符串 函数返回值:无*/下标: 0 1 2 3 4 5 6 7 8 9 10 11 HelloChina
20、0HelloChina0fromitoi下标移动方向toi=0fromto结束拷贝ii+i 第32页/共65页第三十二页,共66页。33例7.5 字符串拷贝(kobi)方法1:用字符(z f)数组编程实现 void MyStrcpy(char dstStr, char srcStr)int i = 0; while (srcStri != 0) dstStri = srcStri; i+; dstStri = 0;第33页/共65页第三十三页,共66页。34方法2:用字符指针编程实现 /*函数功能(gngnng):字符串拷贝 函数参数:字符型指针srcStr,指向源字符串 字符型指针dstSt
21、r,指向目的字符串 函数返回值:无*/例7.5 字符串拷贝(kobi)HelloChina0HelloChina0*from* to指针移动方向指针移动方向*to=0tofrom+fromfromto+to第34页/共65页第三十四页,共66页。35方法2:用字符指针(zhzhn)编程实现 void MyStrcpy(char *dstStr, const char *srcStr)while (*srcStr != 0) *dstStr = *srcStr; srcStr+; dstStr+; *dstStr = 0; 例7.5 字符串拷贝(kobi)第35页/共65页第三十五页,共66页。
22、36例7.6 计算(j sun)实际字符个数方法1:用字符数组实现/*函数功能: 计算字符串的长度(chngd)函数参数: 字符型数组str,存储字符串函数返回值:字符串的长度(chngd)*/unsigned int MyStrlen(char str) int i ;unsigned int len = 0; for (i=0; stri!=0; i+) len+; return (len); 第36页/共65页第三十六页,共66页。37例7.6 计算(j sun)实际字符个数方法2:用字符指针实现/*函数功能: 计算字符串的长度函数参数: 字符型指针变量(binling)pStr,指向字
23、符串函数返回值:字符串的长度*/unsigned int MyStrlen(char *pStr) unsigned int len = 0; for (; *pStr!=0; pStr+) len+; return (len); 第37页/共65页第三十七页,共66页。38指针的算术运算和关系运算常常是针对(zhndu)数组元素;表达式中,数组名被自动转化为指向数组中第一个元素的常量指针;数组的下标运算符“ ”实际上就是以一个指针作为其操作数;(ai,解释为*(a+i))数据元素可以通过指针来引用,指针也可用下标形式来表示。第38页/共65页第三十八页,共66页。39数组名就是一个指针只是不
24、能修改这个(zh ge)指针的指向可以定义函数的参数为数组名指针也可当作数组名使用 int *p, a10;p = a;数组元素的几种等价引用形式(1)ai(2)*(a+i)(3)pi(4)*(p+i)60006001600260036004600560066007a0a1a2a3aa+1a+260006001600260036004600560066007a0a1a2a3app+p+P+1与P+?第39页/共65页第三十九页,共66页。40输入输出数组的全部(qunb)元素main() int a10; int i; for (i=0; i10; i+) scanf(%d, &ai)
25、; for (i=0; i10; i+) printf(%d , ai); main() int a10; int *p, i; for (p=a; p(a+10); p+) scanf(%d, p); for (p=a; p(a+10); p+) printf(%d , *p); 方法(fngf)1:下标法方法(fngf)2:指针法第40页/共65页第四十页,共66页。41例7.7 在一个已排好序的数组中插入一个数据x,插入后数组元素(yun s)保持排序关键:找到该插入的位置,然后(rnhu)依次移动插入位置及其后的所有元素腾出这一位置放入待插入的元素 1 3 5 7 9a0 a1 a2
26、a3 a4 a5插入位置pos x=4x插入前: 1 3 4 5 7 9 x插入后:插入元素xa0 a1 a2 a3 a4 a5第41页/共65页第四十一页,共66页。42#include #define ARR_SIZE 10void Insert(int a,int n,int x);main() int aARR_SIZE+1,x,i,n; scanf(%d,&n); /*插入(ch r)元素前数组元素的个数*/ for (i=0;in;i+) scanf(“%d” ,&ai); /*输入排好序的元素*/ scanf(“%d”,&x); /*输入待插元素*/ In
27、sert(a,n,x); for (i=0;in+1;i+) printf(“%-4d” ,ai); 第42页/共65页第四十二页,共66页。43void Inseart(int a, int n, int x) int i, pos; for (i=0; (i ai); i+) pos = i; for (i = n-1; i = pos; i-) ai+1 = ai; /*向后移动(ydng)*/apos = x; /*插入元素x到位置pos*/例7.7 在一个已排好序的数组中插入一个数据x,插入后数组元素保持(boch)排序第43页/共65页第四十三页,共66页。44指针变量作为(zuw
28、i)函数参数实现插入#include #define ARR_SIZE 10void Insert(int a,int n,int x);main() int aARR_SIZE+1,x,i,n; int *P=NULL; p=a Insert(a,n,x); void Inseart(int a, int n, int x) 第44页/共65页第四十四页,共66页。45删除数组中指定(zhdng)元素 3 2 4 5 6 删除x后:插入元素xa0 a1 a2 a3 a4 a5 3 2 1 4 5 6a0 a1 a2 a3 a4 a5待删除位置pos x=1删除x前: 第45页/共65页第四十
29、五页,共66页。46C语言将二维数组看作(kn zu)一维数组,其每个数组元素又是一个一维数组a00a01a02a10a11a12aa0+0a+1a1+0a0+1a0+2&a00&a10&a11a1+1&a12&a01&a02a1+2 a23; a00 a0a01a02a10 a1 a11a12 a 第46页/共65页第四十六页,共66页。47一维数组a a1 a00 a01 a02 a03 a10 a11 a12 a13 a20 a21 a22 a23行地址列地址列地址列地址a0+0 a0+1 a0+2 a0+3a2+0 a2+1 a2+2 a
30、2+3a1+0 a1+1 a1+2 a1+3一维数组a2一维数组a1一维数组a0a0 a2 a+0 &a0 a+1 &a1 a+2&a2 第47页/共65页第四十七页,共66页。48a 代表二维数组的首地址(dzh),第0行的地址(dzh)a+i 代表第i行的地址(dzh)*(a+i) 即 ai 代表第i行第0列的地址(dzh)*(a+i)+j 即 ai+j 代表第i行第j列的地址(dzh)*(*(a+i)+j ) 即 aij 代表第i行第j列的元素第48页/共65页第四十八页,共66页。49元素aij的地址的几种等价的引用(ynyng)方式&aij ai+j
31、*(a+i)+j &(*(a+i)j元素aij的几种等价的引用(ynyng)方式aij *(ai+j) *(*(a+i)+j) (*(a+i)j第49页/共65页第四十九页,共66页。50 char weekDay710 = Sunday, Monday, Tuesday,Wednesday, Thursday, Friday, Saturday; 0Sunday1Monday2Tuesday3Wednesday4Thursday5Friday6SaturdaySunday0Monday0Tuesday0Wednesday0Thursday0Friday0Saturday0第50页/共
32、65页第五十页,共66页。51#include main() int i, pos;int findFlag = 0; char x10;char weekDay10 = Sunday,Monday,Tuesday, Wednesday,Thursday,Friday, Saturday; printf(Please enter a string:);scanf(%s, x); for (i=0; i7 & !findFlag; i+) if (strcmp(x, weekDayi) = 0) pos = i; findFlag = 1; if (findFlag) printf(%s
33、 is %dn, x, pos);else printf(Not found!n);例7.8第51页/共65页第五十一页,共66页。52二维数组的指针行指针定义的一般格式:类型(lixng)关键字 (*P)常量N int (*p)3; p = a;/用行地址初始化 for (i=0; im; i+)for (j=0; jn; j+) printf(%d,*(*(p+i)+j);a00a01a02a10a11a12pp+第52页/共65页第五十二页,共66页。53二维数组的指针(zhzhn)列指针(zhzhn)int *p;p = *a;/用列地址初始化相对于数组起始地址的偏移量i*n+jfor
34、 (i=0; im; i+)for (j=0; jn; j+) printf(%d,*(p+i*n+j);a00a01a02a10a11a12pp+第53页/共65页第五十三页,共66页。54659787927692919094706580第54页/共65页第五十四页,共66页。55int FindMax(int *p, int m, int n, int *pRow, int *pCol) int i, j, max;max = p0; *pRow = 0; *pCol = 0; for (i=0; im; i+)for (j = 0; j max) max = pi*n+j; *pRow = i; *pCol = j; return (max); 第55页/共65页第五十五页,共66页。56元素均为指针类型数据(shj)的数组,称为指针数组 定义形式为: 类型关键字 *数组名数组长度;例如 char *pStr5;初始化 char * pstr =aa, bbb, cccccccc;第56页/共65页第五十六页,共66页。57方法(fngf)1:用二维数组来实现char strN10 = Pascal,Basic,Fortran, Java,Visual C; for (i=0; iN-1; i+) f
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 《商务英语笔译》课件-第九模块
- 某部年度副食品供应采购 投标方案(技术方案)
- 装修工程居间合同样本
- 生态旅游开发
- 废水处理工程可行性研究报告
- 2025年度搬家服务车辆买卖及培训服务合同
- 股份制改革关键策略与执行方案设计
- 教育机构品牌传播方案
- 课题完成课题的可行性分析怎么填
- 财务管理与财务报告编制指南
- 成人重症患者镇痛管理(专家共识)
- 2022年新高考辽宁历史高考真题含解析
- 澳大利亚11天自由行行程单英文版
- 员工守则十条
- 【中国民航安检的发展现状及发展建议4000字(论文)】
- 房地产市场调研表格
- Audio-Jack-连接器设计经验
- S7-200SMARTPLC应用技术PPT完整全套教学课件
- 硬笔控笔训练字帖
- 国家自然科学基金经费预算表模板
- 华能电力定员标准
评论
0/150
提交评论