[计算机软件及应用]C语言程序设计教程第7章-指课件.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《[计算机软件及应用]C语言程序设计教程第7章-指课件.ppt》由用户(三亚风情)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机软件及应用 计算机软件 应用 语言程序设计 教程 课件
- 资源描述:
-
1、信息科学与工程学院C语言程序设计语言程序设计信息科学与工程学院第第7章章 指针指针 本章需要掌握的知识点本章需要掌握的知识点指针的概念指针的概念指针的运算指针的运算指针作为函数的参数时的运作方式指针作为函数的参数时的运作方式指针跟数组的关系指针跟数组的关系动态内存申请和释放动态内存申请和释放信息科学与工程学院内容安排内容安排 7.1 指针的基本概念和运算指针的基本概念和运算 7.2 指针与函数指针与函数 7.3 指针与一维数组(包含内存的动态分配)指针与一维数组(包含内存的动态分配) *7.4 二级指针二级指针 *7.5 指针数组指针数组 *7.6 指针与二维数组指针与二维数组 *7.7 命令
2、行参数命令行参数信息科学与工程学院7.1 指针的基本概念和运算指针的基本概念和运算地址和指针概念地址和指针概念.ppt.ppt信息科学与工程学院指针的概念指针的概念指针是什么?地址是什么?指针是什么?地址是什么?如何定义和使用指针?如何定义和使用指针?为什么需要指针?为什么需要指针?信息科学与工程学院程序中程序中: : int i; float k; 内存中每个字节有一个编号内存中每个字节有一个编号-地址地址.2000200120022005内存内存02003ik 函数调用时为其分配内存单元函数调用时为其分配内存单元变量变量是对程序中数据是对程序中数据存储空间的抽象存储空间的抽象地址和指针的概
3、念地址和指针的概念信息科学与工程学院.2000200420062005整型变量整型变量i10变量i_pointer200120022003 指针与指针变量指针与指针变量指针:代表内存的某个地址,指向某个变量单元。指针:代表内存的某个地址,指向某个变量单元。指针变量:专门存放内存地址的变量叫指针变量指针变量:专门存放内存地址的变量叫指针变量2000指针指针变量 变量的变量的内容内容 变量的变量的地址地址指针变量指针变量变量变量变量地址变量地址(指针指针)变量值变量值指向地址存入地址存入指针变量指针变量信息科学与工程学院为什么需要指针为什么需要指针方便数组和字符串的处理方便数组和字符串的处理在调用
4、函数时可以得到多个返回结果。在调用函数时可以得到多个返回结果。动态链表建立的需要动态链表建立的需要接口控制的需要接口控制的需要信息科学与工程学院指针变量的定义和使用指针变量的定义和使用指针变量定义的形式:指针变量定义的形式: 类型名类型名 *指针变量名指针变量名;取变量的地址的形式:取变量的地址的形式: &变量名变量名引用变量的值方式:引用变量的值方式:直接用变量名为直接引用;直接用变量名为直接引用;通过指针变量加上通过指针变量加上*号为间接引用号为间接引用;1001000ap1000信息科学与工程学院.2000200420062005整型变量整型变量i10变量变量i_pointer20012
5、00220032000指针变量指针变量200010i_pointer*i_pointer&i_pointerii_pointer &i &(*i_pointer)i *i_pointer *(&i)信息科学与工程学院直接访问:按变量名存取变量值直接访问:按变量名存取变量值间接访问:通过变量地址去访问变量值间接访问:通过变量地址去访问变量值例例 i=3; -直接访问直接访问指针变量指针变量.2000200420062005整型变量整型变量i10变量变量i_pointer20012002200320003例例 *i_pointer=20; -间接访问间接访问20信息科学与工程学院注意事项注意事项如
6、果有了定义如果有了定义int *p,说明,说明p本身也是一个变量,本身也是一个变量,也有地址。也有地址。指针变量是有类型的。指针变量是有类型的。int i; float *p; p=&i; /*错误错误 */ “*”号在定义指针和运算时所起的作用是不同的。号在定义指针和运算时所起的作用是不同的。信息科学与工程学院 7.2 指针与函数指针与函数注意:注意:动态内存分配内容放置在动态内存分配内容放置在7.3进行讲解。进行讲解。在函数调用时,实参向形参传递的方式是什在函数调用时,实参向形参传递的方式是什么?么? 单向赋值单向赋值函数调用(函数调用(COPY)ppt函数调用(指针)函数调用(指针) p
7、pt信息科学与工程学院void swap(int x,int y) int temp; temp=x; x=y; y=temp;void main() int a,b; scanf(%d,%d,&a,&b); if(ab) swap(a,b); printf(n%d,%dn,a,b);例例 将数从大到小输出将数从大到小输出.20002008200A2002200420065变量a 变量b(main)9 变量temp 变量y 变量x(swap)559 59COPY实参到形参是赋值传递实参到形参是赋值传递信息科学与工程学院void swap(int x,int y) int temp; temp=
8、x; x=y; y=temp;void main() int a,b; scanf(%d,%d,&a,&b); if(ab) swap(a,b); printf(n%d,%dn,a,b);例例 将数从大到小输出将数从大到小输出.20002008200A2002200420065变量a 变量b(main)9运行结果:运行结果:5,9信息科学与工程学院void swap(int *p1, int *p2) int p; p=*p1; *p1=*p2; *p2=p;void main() int a,b; int *pointer_1,*pointer_2; scanf(%d,%d,&a,&b);
9、pointer_1=&a; pointer_2=&b; if(ab)swap(pointer_1,pointer_2); printf(n%d,%dn,a,b);.20002008200A200220042006200C200E2010.59整型变量整型变量a 整型变量整型变量b(main)指针指针pointer_1指针指针pointer_220002002(swap)指针指针p1指针指针p2整型整型p5920002002COPY5指针变量作为函数参数。特点:指针变量作为函数参数。特点:地址传递,地址传递,共享内存共享内存,“双向双向”传递传递信息科学与工程学院void swap(int *p
10、1, int *p2) int p; p=*p1; *p1=*p2; *p2=p;void main() int a,b; int *pointer_1,*pointer_2; scanf(%d,%d,&a,&b); pointer_1=&a; pointer_2=&b; if(ab)swap(pointer_1,pointer_2); printf(n%d,%dn,a,b);.20002008200A200220042006200C200E2010.59整型变量整型变量a 整型变量整型变量b(main)指针指针pointer_1指针指针pointer_22000200259地址传递地址传递运
11、行结果:运行结果:9,5信息科学与工程学院注意事项注意事项无论形参的类型是什么,在函数调用时,无论形参的类型是什么,在函数调用时,实参都是单向的将值赋给形参。实参都是单向的将值赋给形参。为什么为什么scanf函数中的参数是地址的列表而函数中的参数是地址的列表而不是变量的列表?不是变量的列表? scanf(“%d%d”, &a, &b);如果想在被调函数中改变调用函数中变量如果想在被调函数中改变调用函数中变量的值,如何做?的值,如何做?信息科学与工程学院*返回指针值的函数、指向函数的指针返回指针值的函数、指向函数的指针(自学)(自学)信息科学与工程学院7.3 指针与一维数组及指针与一维数组及 指
12、针的运算指针的运算一个变量有地址,那么每个数组元素是否有一个变量有地址,那么每个数组元素是否有地址?地址?属于同一个数组的元素在内存中是放置在一属于同一个数组的元素在内存中是放置在一起的,占用一片连续的内存,那么整个数组起的,占用一片连续的内存,那么整个数组的地址应该如何表示比较合适?的地址应该如何表示比较合适?既然数组元素是放置在一起的,我们是否可既然数组元素是放置在一起的,我们是否可以通过指针的移动来访问数组中不同的元素?以通过指针的移动来访问数组中不同的元素?如果指针可以移动,那么应该怎样移动?如果指针可以移动,那么应该怎样移动?信息科学与工程学院如果指针如果指针p指向数组指向数组a的第
13、一个元素,那么的第一个元素,那么如何引用数组第一个元素的值?如何引用数组第一个元素的值?如何引用数组第二个元素的值?如何引用数组第二个元素的值?数组的名字代表数组的首地址,该地址值数组的名字代表数组的首地址,该地址值不能发生改变,即数组名是一个常量指针。不能发生改变,即数组名是一个常量指针。数组与指针数组与指针ppt(一维)(一维)信息科学与工程学院指针变量的赋值运算指针变量的赋值运算p=&a; (将变量将变量a地址地址p)p=array; (将数组将数组array首地址首地址p)p=&arrayi; (将数组元素地址将数组元素地址p)p1=p2; (指针变量指针变量p2值值p1)指针的运算指
14、针的运算信息科学与工程学院指针的算术运算:指针的算术运算:v指针可以加减一个整数,意义?指针可以加减一个整数,意义?p1p1与与p2p2指向同一数组,指向同一数组,p1- p2 p1- p2 代表代表两指针间元素个数两指针间元素个数p1+p2 p1+p2 无意义无意义例例 p指向指向int型数组,且型数组,且p=&a0; 则则p+1 指向指向a1例例 int a10;int a10; int int * *p=&a2;p=&a2; p+; p+; * *p=1;p=1;例例 int a10;int a10; int int * *p1=&a2;p1=&a2; int int * *p2=&a5
15、;p2=&a5; 则:则:p2-p1p2-p1?a0a1a2a3a4a5a6a7a8a9a数组数组pp+1,a+1p+i,a+ip+9,a+91信息科学与工程学院指针变量的关系运算指针变量的关系运算若若p1和和p2指向同一数组,则指向同一数组,则lp1p2 表示表示p1指的元素在后指的元素在后lp1= =p2 表示表示p1与与p2指向同一元素指向同一元素若若p1与与p2不指向同一数组,比较无意义不指向同一数组,比较无意义p= =NULL或或p!=NULL信息科学与工程学院 数组元素表示方法数组元素表示方法a0a1a2a3a9.aa+9a+1a+2地址元素下标法a0a1a2a9a0a1a2a3a
16、9.pp+9p+1p+2地址元素指针法*p*(p+1)*(p+2)*(p+9) 变址运算符ai *(a+i)ai pi *(p+i) *(a+i)*a*(a+1)*(a+2)*(a+9)p0p1p2p9信息科学与工程学院数组元素的引用方法数组元素的引用方法#include stdio.hvoid main() int a5,*pa,i; for(i=0;i5;i+) ai=i+1; pa=a; for(i=0;i5;i+) printf(*(pa+%d):%dn,i,*(pa+i); for(i=0;i5;i+) printf(*(a+%d):%dn,i,*(a+i); for(i=0;i5;
17、i+) printf(pa%d:%dn,i,pai); for(i=0;i5;i+) printf(a%d:%dn,i,ai);信息科学与工程学院例例 int a=1,2,3,4,5,6,7,8,9,10,*p=a,i=2; 数组元素地址的正确表示:数组元素地址的正确表示:(A)&(a+1) (B)a+ (C)&p (D)&pi数组名是数组名是地址常量地址常量p+,p- ( )a+,a- ( )a+1, *(a+2) ( )信息科学与工程学院#include stdio.hvoid main() int i,*p,a7; p=a; for(i=0;i7;i+) scanf(%d,p+); pr
展开阅读全文