c 语言 第7章 指针

上传人:豆浆 文档编号:24797619 上传时间:2017-12-07 格式:PPT 页数:55 大小:766KB
返回 下载 相关 举报
c 语言 第7章 指针_第1页
第1页 / 共55页
c 语言 第7章 指针_第2页
第2页 / 共55页
c 语言 第7章 指针_第3页
第3页 / 共55页
c 语言 第7章 指针_第4页
第4页 / 共55页
c 语言 第7章 指针_第5页
第5页 / 共55页
点击查看更多>>
资源描述

《c 语言 第7章 指针》由会员分享,可在线阅读,更多相关《c 语言 第7章 指针(55页珍藏版)》请在金锄头文库上搜索。

1、第7章 指针,C语言大学实用教程,内容提要,指针的概念;难点:对指针数据类型的理解 用指针做函数参数; 利用字符指针存取字符串;字符数组和字符指针的区别与联系 指针数组应用;指向数组的指针与指针数组的区别 带参数的main函数;动态内存分配函数及其应用;一维、二维动态数组的实现,为什么引入指针的概念,铁杆C/C+程序员最挚爱的武器:指针C/C+的高效、高能主要来自于指针很多不可能的任务由指针完成,运行结果main()char*a=main()char*a=%c%s%c;printf(a,34,a,34); printf(a,34,a,34);,源程序main()char*a=main()cha

2、r*a=%c%s%c;printf(a,34,a,34);printf(a,34,a,34);,为什么引入指针的概念,指针为函数提供修改实参变量值的手段 为C的动态内存分配系统提供支持 为动态数据结构(如例链表、队列、二叉树等)提供支持 可以改善某些子程序的效率,计算机内的存储部件,所有指令和数据都保存在内存里速度快,但是掉电即失可以随机访问只要指明要访问的内存单元的地址,就可以立即访问到该单元地址是一个无符号整数,其字长一般与主机相同内存中的每个字节都有唯一的一个地址地址按字节编号,按类型分配空间,内存(Random Access Memory)地址(Address),寻址方式,如何读写内存

3、中的数据?通过变量的地址访问变量所在的存储单元两种寻址方式直接(寻址)访问通过变量地址直接存取变量内容间接(寻址)访问通过指针变量来间接存取它所指向的变量,指针(Pointer)的概念,指针也是一种数据类型指针变量 声明为指针类型的变量,专门存放地址数据的变量,如何定义指针变量?,定义指针变量int *p;定义了一个指针变量p,简称指针pp是变量,int*是类型p里保存一个地址。此时这个地址是什么呢(p指向哪呢)?指针变量初始化p = *p就像普通的变量一样使用,其值是p指向的内存的内容(在上例和a等价,但寻址方式不同)p可以动态(任意)地指向不同内存,从而使*p代表不同的变量,int i,*

4、p;p=,int *p;float *q;p=q;,int i;float *p;p=,int *p;p=100;,判断是真?是假?,指针变量只存放地址!,一个指针变量不能指向与其类型不同的变量!,我是真的,你猜对了吗?,应在类型相同的指针变量之间赋值,&与*操作符,*用来取指针指向地址的内容*p = 0;,指针变量与其它类型变量的对比,共性在内存中占据一定大小的存储单元先定义,后使用特殊性 它的内容只能是地址,而不能是数据必须初始化后才能使用,否则指向不确定的存储单元,对该空间进行访问,将可能造成危险可参与的运算:加、减一个整数,自增、自减、关系、赋值只能指向同一基类型的变量,指针的指向,只

5、能指向同一基类型的变量,否则将引起warningfloat x; int *p = TC编译warning: Suspicious pointer conversion in function mainVC编译warning C4133: = : incompatible types - from float * to int *,指针运算,算术运算int *p, a10; p = a; p+; /*p的值增加多少?*/指针的加减运算是以其指向的类型的字节长度为单位的,6000600160026003600460056006,指针运算,int *p, *q, a10;p = a;q = 指针运

6、算不能乱算一般只进行指针和整数的加减运算,同类型指针之间的减法运算其它运算,比如乘法、除法、浮点运算、指针之间的加法等,并无意义,所以也不支持,指针运算,关系运算指向同一种数据类型的两个指针才能进行关系运算值为1或0p q p q p = q不能与非指针类型变量进行比较,但可与NULL(即0值)进行等或不等的关系运算判断p是否为空指针P = NULLp != NULL,指针运算,赋值运算指针在使用前一定要赋值为指针变量赋的值必须是一个地址,main() int *p; scanf(%d,p); ,main() int a,*p= ,错!但TC下不报错VC下报错,指针与函数,指针既然是数据类型,

7、自然可以做函数参数和返回值的类型指针做函数参数的经典例子:两数的互换,void Swap(int *x,int *y) int temp; temp = *x; *x = *y; *y = temp;,main() int a, b; a = 15; b = 8; Swap( ,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);,程序 1,程序 2,例:编写函数实现两数的互换,实 参,形 参,结

8、果有何不同?,Not Work!Why?,主调函数,被调函数,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;,5,5,a,b,实 参,形 参,9,9,程序 1,x,y,5,5,temp,9,主调函数,被调函数,main() int a, b; a = 15; b = 8; Swap(,void Swap(int *x, int *y) int temp; temp = *x; *x = *

9、y; *y = temp;,&a,&a,实 参,形 参,&b,&b,程序 2,x,y,5,temp,5,a,b,9,9,5,简单变量作函数参数与指针变量作函数参数的比较,swap函数的几种错误形式(1/3),参数单向传递void Swap(int x, int y) int temp; temp = x; /*x,y为内部变量*/ x = y; y = temp;,swap函数的几种错误形式(2/3),参数单向传递void Swap(int *p1, int *p2) int *p; p = p1; /*p1,p2为内部变量*/ p1 = p2; p2 = p;,swap函数的几种错误形式(3

10、/3),指针p没有确切地址void Swap(int *p1, int *p2) int *p; /*指针p未初始化*/ *p = *p1; / *p1是值, p应该初始化 *p1 = *p2; *p2 = *p;,字符串与字符数组、字符指针,C语言并没有为字符串提供任何专门的表示法,完全使用字符数组和字符指针来处理字符串一串以0结尾的字符字符数组每个元素都是字符类型的数组char string100;字符指针指向字符类型的指针char *p;数组和指针可以等同看待,上面三者本质上是一回事,字符指针变量与字符数组的区别,定义方法不同 char str10; char *ptr;赋值方法不同 c

11、har str10; str = ”china”; /*错误*/ strcpy(str,”china”); /*正确*/ char *ptr; ptr = ”china”; /好办法字符指针是变量,而数组名是地址常量,使用字符指针的注意事项,字符指针变量必须有明确的指向,否则使用是危险的例如,输入字符串时 char *a; scanf(%s, a); /*错误*/ 应为: char *a; char str10; a = str; scanf(%s, a); /*正确*/,例 :字符串拷贝用字符数组编程,void MyStrcpy(char dstStr, char srcStr)int i

12、= 0; while (srcStri != 0) dstStri = srcStri; i+; dstStri = 0;,void MyStrcpy(char *dstStr, const char *srcStr)while (*srcStr != 0) *dstStr = *srcStr; srcStr+; dstStr+; *dstStr = 0; ,当只允许函数访问地址内容,不允许修改时,可以把函数的指针参数定义为const,例 :字符串拷贝用字符指针编程,例 :计算实际字符个数,unsigned int MyStrlen(char str) int i;unsigned int l

13、en = 0; for (i=0; stri!=0; i+) len+; return (len);,unsigned int MyStrlen(char *pStr) unsigned int len = 0; for (; *pStr!=0; pStr+) len+; return (len); ,方法2:用字符指针实现,方法1:用字符数组实现,指针与数组,数组名就是一个指针只是不能修改这个指针的指向可以定义函数的参数为数组指针也可当作数组名使用int *p, a10;p = a;数组元素的几种等价引用形式ai*(a+i)pi*(p+i),60006001600260036004600560066007,a,a+1,a+2,60006001600260036004600560066007,a,p+,p+,输入输出数组的全部元素,main() int a10; int i; for (i=0; i10; i+) scanf(%d, ,方法1:下标法,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);,

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 行业资料 > 其它行业文档

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