C语言程序设计第四版_第1页
C语言程序设计第四版_第2页
C语言程序设计第四版_第3页
C语言程序设计第四版_第4页
C语言程序设计第四版_第5页
已阅读5页,还剩32页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、C语言程序设计第四版第第8 8C语言程序设计第四版指针是指针是C语言的一个重要特色;语言的一个重要特色;正确而灵活地运用指针可以:正确而灵活地运用指针可以:有效表示复杂的数据结构;有效表示复杂的数据结构;能动态分配内存;能动态分配内存;方便地使用字符串;方便地使用字符串;有效而方便地使用数组;有效而方便地使用数组;在调用函数时能获得在调用函数时能获得1个以上的结果;个以上的结果;能直接处理内存单元的地址能直接处理内存单元的地址可以使程序简洁、紧凑、高效可以使程序简洁、紧凑、高效关于指针关于指针C语言程序设计第四版 由内存单元组成,每个单元有地址,存由内存单元组成,每个单元有地址,存放一字节数据

2、放一字节数据内存储器内存储器1010013A613A513A7short int a;变量变量aa=500;内存地址是二进制数,内存地址是二进制数,通常写成十六进制通常写成十六进制C语言程序设计第四版内存地址内存地址内存中存储单元的编号内存中存储单元的编号 计算机内存由大量存储单元计算机内存由大量存储单元 (memory unit)组成。组成。 每个存储单元容量为字节每个存储单元容量为字节(byte) 。 每个存储单元有编号,即存储单元的每个存储单元有编号,即存储单元的“地址地址” (address) 。 存储单元中可存放数据存储单元中可存放数据(data)。C语言程序设计第四版变量的地址变量

3、的地址 定义变量时,系统分配给变量的内定义变量时,系统分配给变量的内存单元的起始地址存单元的起始地址 变量值的存取通过变量在内存中的变量值的存取通过变量在内存中的地址进行地址进行 变量的地址称为变量的地址称为“指针指针”(pointer)C语言程序设计第四版(1)直接访问直接访问直接利用变量的地址进直接利用变量的地址进行存取行存取 例:例:short int a; /分配内存地址分配内存地址 a=500; 在符号表中检索变量名在符号表中检索变量名a,找到其起,找到其起始地址始地址(例如例如13A6);将数值;将数值500(的二进的二进制形式制形式)送到内存单元送到内存单元13A6和和13A7中

4、中变量的访问方式变量的访问方式C语言程序设计第四版(2)间接访问间接访问通过指针变量访问变量通过指针变量访问变量地址地址 定义一种特殊的变量,用来存放其定义一种特殊的变量,用来存放其它变量的地址(指针),这种变量称为它变量的地址(指针),这种变量称为指针变量,它指向一个普通的变量。指针变量,它指向一个普通的变量。变量的访问方式变量的访问方式C语言程序设计第四版指针变量的定义和调用指针变量的定义和调用int a;int *a_pointer;a = 500;a_pointer = &a;printf(%dn,*a_pointer);printf(%xn,a_pointer);*a_pointer

5、 = 3;定义一个指针变量定义一个指针变量它指向一个整型变量它指向一个整型变量(基类型基类型)给指针变量赋值给指针变量赋值指针变量的值是指针变量的值是另一个变量的地址另一个变量的地址指针变量所指向的指针变量所指向的变量即变量即a的值的值指针变量的值,指针变量的值,即即a的地址的地址对指向的变量对指向的变量(即即a)赋值赋值例:例:73页输页输出格出格式式C语言程序设计第四版两个指针变量交换两个指针变量交换了它们的值,也就了它们的值,也就是交换了指向是交换了指向int main() int n1,n2; int *n1_p=&n1, *n2_p=&n2, *pointer; printf(Inp

6、ut n1:); scanf(%d,n1_p); printf(Input n2:); scanf(%d,n2_p); printf(n1=%d, n2=%dn, n1, n2); printf(*n1_p=%d, *n2_p=%dn, *n1_p, *n2_p); printf(n1_p=%o, n2_p=%on, n1_p, n2_p); pointer=n1_p; n1_p=n2_p; n2_p=pointer; printf(n1=%d, n2=%dn, n1, n2); printf(*n1_p=%d, *n2_p=%dn, *n1_p, *n2_p); printf(n1_p=%o

7、, n2_p=%on, n1_p, n2_p);例例. 分析以下程序运行结果分析以下程序运行结果C语言程序设计第四版开始时指针变量开始时指针变量n1_p指向指向n1,指针变量,指针变量n2_p指向指向n2。变量变量n1和和n2的值并没有改变,但的值并没有改变,但n1_p 和和n2_p的值改变了,也就是指向改变了。指的值改变了,也就是指向改变了。指针变量针变量n1_p指向指向n2,指针变量,指针变量n2_p指向指向n1。上页代码要点上页代码要点C语言程序设计第四版内存内存内存单元内存单元内存单元的地址内存单元的地址变量的首地址变量的首地址指针指针指针变量指针变量指针变量的指向指针变量的指向直接访

8、问与间接访问直接访问与间接访问掌握几个重要概念掌握几个重要概念区别两个区别两个 *p int *p; p=&a; *p=3;C语言程序设计第四版指针变量的重要作用之一指针变量的重要作用之一 作为函数的参数,实现地址传递作为函数的参数,实现地址传递C语言程序设计第四版int main() void s p1,int p2); int a,b; scanf(%d,%d,&a,&b); if(ab) s); printf(%d,%dn,a,b); return 0; 例例 函数调用中的值传递函数调用中的值传递void s p1,int p2) int p; p=p1; p1=p2; p2=p;运行结

9、果:运行结果:a,b没有交换。没有交换。原因:原因:C语言中,实参向形参语言中,实参向形参传递数据采用传递数据采用“值传递值传递”,形参单独占用内存单元,交形参单独占用内存单元,交换对实参无影响。换对实参无影响。C语言程序设计第四版void s *p1,int *p2) int p; p=*p1; *p1=*p2; *p2=p;例例 通过指针变量实现地址传递的效果通过指针变量实现地址传递的效果注意这两个注意这两个*p1的的含义不同,前者说含义不同,前者说明明p1为指针变量,为指针变量,后者表示后者表示p1所指向所指向的变量。的变量。int main() void s *p1,int *p2);

10、 int a,b; int *a_p=&a, *b_p=&b; scanf(%d,%d,&a,&b); if(ab) s); printf(%d,%dn,a,b); return 0; p是普通的变量是普通的变量C语言程序设计第四版指针变量作为函数的参数指针变量作为函数的参数指针作实参,对应的形参是指针变量。指针作实参,对应的形参是指针变量。C语言的参数传递是语言的参数传递是“值传递值传递”。指针变量做参数时,由于其值为变量的地址,指针变量做参数时,由于其值为变量的地址,产生产生“地址传递地址传递”的效果。的效果。数组做函数的参数时,也是数组做函数的参数时,也是“地址传递地址传递”。被调用函数

11、不能改变实参指针变量的值,但被调用函数不能改变实参指针变量的值,但可以改变实参指针变量所指向的变量的值。可以改变实参指针变量所指向的变量的值。C语言程序设计第四版指针变量指针变量阅读例阅读例8.2-例例8.5,上机调试,观察结果,分,上机调试,观察结果,分析掌握。析掌握。要求能够熟练地掌握指针变量及其指向的变要求能够熟练地掌握指针变量及其指向的变化过程,能够在纸上画图表达分析过程。化过程,能够在纸上画图表达分析过程。C语言程序设计第四版访问数组访问数组指针的又一重要用途指针的又一重要用途short int a3;200020022004a0a1a2元素的地址元素的地址数组元素数组元素元素的值元

12、素的值00110a2=6;xxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxx元素的地址元素的地址数组的首地址数组的首地址C语言程序设计第四版数组和指针的相关概念数组和指针的相关概念数组的指针:数组在内存中的起始地址,数组的指针:数组在内存中的起始地址,即首元素即首元素(下标为下标为0的元素的元素)的首地址的首地址数组元素的指针:数组元素在内存中的数组元素的指针:数组元素在内存中的起始地址起始地址数组名:代表数组首元素的地址数组名:代表数组首元素的地址(指针指针)指向数组的指针变量:存储数组某个元指向数组的指针变量:存储数组某个元素的地址,即指向

13、某个元素素的地址,即指向某个元素C语言程序设计第四版定义指向数组的指针变量定义指向数组的指针变量u int array5, *pointer = array;u int array5, *pointer; pointer = array; u int array5, *pointer = &array0; 使用指针访问数组元素,能使目标程使用指针访问数组元素,能使目标程序占用内存少、运行速度快。序占用内存少、运行速度快。C语言程序设计第四版通过指针引用数组元素通过指针引用数组元素例例int main( ) int a5=12,6,18,23,9; int *p; p=a; printf(%d,

14、%xn,*p,p); printf(%d,%xn,*(p+2),p+2); p+; printf(%d,%xn,*p,p); p=p+2; printf(%d,%xn,*p,p); return 0;C语言程序设计第四版通过指针引用数组元素通过指针引用数组元素对于数组对于数组a和指向该数组首元素的指针变量和指向该数组首元素的指针变量pp+i 和和 a+i 均表示元素均表示元素ai的地址的地址*(p+i), *(a+i), ai 均表示元素均表示元素ai的值的值p+1的含义是指向下一个元素地址的含义是指向下一个元素地址可以可以p+,不能不能a+首元素地址不能改变首元素地址不能改变注意区别注意区别

15、*p+(等价于(等价于*(p+)), *(+p)和和(*p)+(P.236-237)若定义数组若定义数组a5和指针变和指针变量量*p=a,则,则a6等价于等价于p+6,指针指向数组之后,指针指向数组之后的地址,故不报错的地址,故不报错参见参见P.378 运算符的运算符的优先级与结合性优先级与结合性C语言程序设计第四版通过指针引用数组元素通过指针引用数组元素例例教材教材 P.233-234 例例8.6三种表达方式三种表达方式P.235 例例8.7 不能达到目的不能达到目的C语言程序设计第四版数组名作为函数的参数数组名作为函数的参数进一步分析进一步分析用指针访问数组用指针访问数组 实参实参 形参形

16、参数数 组组 名名 数数 组组 名名数数 组组 名名 指针变量指针变量指针变量指针变量 指针变量指针变量指针变量指针变量 数数 组组 名名数组名数组名指针变量指针变量C语言程序设计第四版数组名作为函数的参数数组名作为函数的参数以指针表示以指针表示P.239 例例8.8 数组元素逆序排列数组元素逆序排列 形参:数组名;实参:数组名形参:数组名;实参:数组名P.241 例例8.8 程序修改程序修改 形参:指针变量形参:指针变量P.242 例例8.9 数组元素逆序排列数组元素逆序排列 形参:指针变量;实参:指针变量形参:指针变量;实参:指针变量P.244 例例8.10 选择排序选择排序 形参:数组;

17、实参:指针变量形参:数组;实参:指针变量P.245 例例8.10 函数修改函数修改 形参:指针变量形参:指针变量C语言程序设计第四版多维数组的指针多维数组的指针以二维数组为例以二维数组为例例:声明数组例:声明数组 int a34a00 a01 a02 a03a10 a11 a12 a13a20 a21 a22 a23a &a00 a0a+1 &a10 a1a+2 &a20 a2二维数组的行指针:以二维数组名表示二维数组的行指针:以二维数组名表示C语言程序设计第四版多维数组的指针多维数组的指针以二维数组为例以二维数组为例例:声明数组例:声明数组 int a34a00 a01 a02 a03a10

18、 a11 a12 a13a20 a21 a22 a23二维数组的行指针:以二维数组名表示二维数组的行指针:以二维数组名表示int *p=a;p=a+1;p=a+2;p = a00p = a10p = a20C语言程序设计第四版多维数组的指针多维数组的指针以二维数组为例以二维数组为例例:声明数组例:声明数组 int a34a00 a01 a02 a03a10 a11 a12 a13a20 a21 a22 a23a0 &a00a0+1 &a01a1+2 &a12 a0+5 &a11二维数组的列指针:以一维数组名表示二维数组的列指针:以一维数组名表示C语言程序设计第四版多维数组的指针多维数组的指针以

19、二维数组为例以二维数组为例例:声明数组例:声明数组 int a34a00 a01 a02 a03a10 a11 a12 a13a20 a21 a22 a23二维数组的列指针:以指针变量表示二维数组的列指针:以指针变量表示int *p;p=a;p+;p=p+5;p = a00p = a01p = a12C语言程序设计第四版通过指针引用字符串通过指针引用字符串字符串是在内存中连续存放的一组字符字符串是在内存中连续存放的一组字符以变量形式保存字符串需要声明字符数组以变量形式保存字符串需要声明字符数组或声明一个指针变量访问字符串或字符数组或声明一个指针变量访问字符串或字符数组(P.257图图8.28)

20、不是字符串变量不是字符串变量char *string;string=Work hard!;printf(%sn,string);printf(%cn,*string+);printf(%cn,*(string+5);printf(%sn,string);+在后,先取在后,先取p值,再值,再+,p用于用于*p请对照请对照*(+p)C语言程序设计第四版通过指针引用字符串通过指针引用字符串P.255 例例8.16 使用字符数组存放字符串使用字符数组存放字符串 使用字符数组名输出字符串使用字符数组名输出字符串 使用字符数组下标访问数组元素使用字符数组下标访问数组元素C语言程序设计第四版通过指针引用字符

21、串通过指针引用字符串P.256 例例8.17 使用基类型为字符的指针使用基类型为字符的指针变量保存字符串首元素地址,从而访问变量保存字符串首元素地址,从而访问字符串字符串 char *p=China; printf(%s,p);P.256例例8.18数组名指针的应用数组名指针的应用(字符型字符型)P.256例例8.19指针变量访问字符型数组指针变量访问字符型数组相当于相当于 char *p; p=China;而不是而不是 char *p; *p=China;C语言程序设计第四版通过指针引用字符串通过指针引用字符串字符指针作函数参数字符指针作函数参数 实参实参 形参形参数组名数组名 数组名数组名

22、数组名数组名 指针变量指针变量指针变量指针变量 指针变量指针变量指针变量指针变量 数组名数组名P.259-263 例例8.20各种不同的表达方式各种不同的表达方式节节 分析一些容易发生的错误分析一些容易发生的错误C语言程序设计第四版指向函数的指针指向函数的指针指向函数代码的起始地址。指向函数代码的起始地址。若声明一个指针变量存放该地址,则可通过此若声明一个指针变量存放该地址,则可通过此指针变量来调用该函数。指针变量来调用该函数。 例:例:P.267 改写的代码改写的代码作用:可用同样的语句调用不同函数作用:可用同样的语句调用不同函数定义一个以指向函数的指针变量作为形参的函定义一个以指向函数的指针变量作为形参的函数,可写出复杂程序数,可写出复杂程序(P.271例例8.24和和P.273分析分析)C语言程序设计第四版返回指针值的函数返回指针值的函数 一个函数,其运算结果和返回值是一个函数,其运算结果和返回值是指针值指针值 P.274 例例8.25 P.275 例例8.26C语言程序设计第四版指针数组和多重指针指针数组和多重指针u指针数组是存放指针数据的数组指针数组是存放指针数据的数组u指向上述数

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论