C语言程序设计(第6章).rtf
《C语言程序设计(第6章).rtf》由会员分享,可在线阅读,更多相关《C语言程序设计(第6章).rtf(14页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第六章第六章第六章 指针指针指针计算机基础教研室计算机基础教研室计算机基础教研室 本章主要内容本章主要内容本章主要内容指针概述指针概述指针概述 地址地址地址 指指指针针针 指指指针变针变针变量量量 多重指多重指多重指针针针 指指指针变针变针变量作量作量作为为为函数参数函数参数函数参数 指针与数组指针与数组指针与数组 数数数组组组、指、指、指针针针与函数与函数与函数调调调用用用 行指行指行指针针针 指指指针针针数数数组组组 带带带参数的主函数参数的主函数参数的主函数 指针与函数指针与函数指针与函数 指向函数的指指向函数的指指向函数的指针变针变针变量量量 返回指返回指返回指针值针值针值的函数的函数
2、的函数 教学目的与要求了解指针与地址的概念了解指针与函数的概念掌握指针变量的定义、初始化及指针的运算掌握指针与数组、指针数组、二级指针等知识掌握指针作为函数参数的应用重点与难点指针与地址的概念指针与变量的关系指针与数组指针与字符串指针数组与二级指针指针的应用一、指针概述一、指针概述一、指针概述1 1 1地址地址地址(addressaddressaddress)P201P201P201 如果在程序中定义了一个如果在程序中定义了一个如果在程序中定义了一个实体实体实体(变量、数组、函数变量、数组、函数变量、数组、函数 ),编译时系统就要给这些实体分配内存单元。),编译时系统就要给这些实体分配内存单元
3、。),编译时系统就要给这些实体分配内存单元。分配规则:分配规则:分配规则:什么是内存单元什么是内存单元什么是内存单元“地址地址地址”?内存单元是以字节为单位,每个字节都有一个编号(即内存单元是以字节为单位,每个字节都有一个编号(即内存单元是以字节为单位,每个字节都有一个编号(即“地地地址址址”)。如果将内存比作一个旅馆,内存单元就好比)。如果将内存比作一个旅馆,内存单元就好比)。如果将内存比作一个旅馆,内存单元就好比“床位床位床位”,而实体则好比而实体则好比而实体则好比“旅客旅客旅客”。这些。这些。这些“旅客旅客旅客”(实体)中,有单人型(实体)中,有单人型(实体)中,有单人型(charcha
4、rchar)、夫妇型()、夫妇型()、夫妇型(intintint)、家庭型()、家庭型()、家庭型(float,long,doublefloat,long,doublefloat,long,double等)等)等),还有团体型(数组等)。每个还有团体型(数组等)。每个还有团体型(数组等)。每个“实体实体实体”占用的内存单元是不同占用的内存单元是不同占用的内存单元是不同的。如的。如的。如:charcharchar a;inta;inta;int b;floatb;floatb;float c;intc;intc;int d3;intd3;intd3;int max(max(max()内存单元与地
5、址内存单元与地址内存单元与地址如何表示实体地址如何表示实体地址如何表示实体地址?实体地址表示法实体地址表示法实体地址表示法1 1 1:直接直接直接访问访问访问(实实实体名)体名)体名)普通变量普通变量普通变量a,b,ca,b,ca,b,c&a,&b,&c&a,&b,&c&a,&b,&c 数组数组数组d3d3d3 d d d(数组名(数组名(数组名),),),&d0&d0&d0,&d1&d1&d1,&d2&d2&d2 对二维数组,可用单下标法表示每行首地址。对二维数组,可用单下标法表示每行首地址。对二维数组,可用单下标法表示每行首地址。如如如 对对对charcharchar x34x34x34,
6、可用,可用,可用x0 x0 x0、x1x1x1、x2x2x2分别表示其第分别表示其第分别表示其第 一、二、三行的首地址。一、二、三行的首地址。一、二、三行的首地址。函数函数函数max(max(max()maxmaxmax(函数名)(函数名)(函数名)“入口地址入口地址入口地址”&取地址运算符(适用于普通取地址运算符(适用于普通取地址运算符(适用于普通变变变量或数量或数量或数组组组元素)元素)元素)实体地址表示法实体地址表示法实体地址表示法2 2 2:间间间接接接访问访问访问(指指指针针针)适合于地址运算(加减等)适合于地址运算(加减等)适合于地址运算(加减等)2 2 2指针(指针(指针(poi
7、nterpointerpointer)实体地址的一种表示法实体地址的一种表示法实体地址的一种表示法(便于编程处理便于编程处理便于编程处理)。指针是一种特殊的数据类型指针是一种特殊的数据类型指针是一种特殊的数据类型存放的是某个实体的地址值。存放的是某个实体的地址值。存放的是某个实体的地址值。3 3 3指针变量指针变量指针变量 P202P202P202 存放存放存放“指针指针指针”(地址值)的特殊变量。(地址值)的特殊变量。(地址值)的特殊变量。定义方法:定义方法:定义方法:类型标识符类型标识符类型标识符 *变量名变量名变量名 如如如 intintint *a;a;a;charcharchar *
8、b;b;b;floatfloatfloat *c;c;c;为什么要使用指针变量为什么要使用指针变量为什么要使用指针变量?C C C程序中访问(读写)变量有两种方式:程序中访问(读写)变量有两种方式:程序中访问(读写)变量有两种方式:直接访问直接访问直接访问 (按名单预留的座位入座)(按名单预留的座位入座)(按名单预留的座位入座)利用实体名访问变量。访问变量的过程利用实体名访问变量。访问变量的过程利用实体名访问变量。访问变量的过程 变量(实体)名变量(实体)名变量(实体)名定义时分配的地址定义时分配的地址定义时分配的地址变量值变量值变量值 好比好比好比“先坐再买票先坐再买票先坐再买票”看电影:来
9、一个观众,分配一个空位给他去坐,并且还要在看电影:来一个观众,分配一个空位给他去坐,并且还要在看电影:来一个观众,分配一个空位给他去坐,并且还要在纸上记一个某人坐在哪里。这种方式对用户来说很方便(纸上记一个某人坐在哪里。这种方式对用户来说很方便(纸上记一个某人坐在哪里。这种方式对用户来说很方便(“直接就座直接就座直接就座”),但对系),但对系),但对系统来说,统来说,统来说,“找某人找某人找某人”就极不方便(间接:查名字座号)。就极不方便(间接:查名字座号)。就极不方便(间接:查名字座号)。间接访问间接访问间接访问 (先买票,后按号入座)(先买票,后按号入座)(先买票,后按号入座)把变量地址先
10、存放在把变量地址先存放在把变量地址先存放在“指针指针指针”中,再通过中,再通过中,再通过“指针指针指针”访问变量。访问变量。访问变量。好比先买票(票好比先买票(票好比先买票(票指针,座号指针,座号指针,座号地址),再地址),再地址),再“按号入座按号入座按号入座”看电影。这种方式对用看电影。这种方式对用看电影。这种方式对用户来说属于户来说属于户来说属于“间接就座间接就座间接就座”,便对系统查找来说就很直接,且便于处理。尤其对于数,便对系统查找来说就很直接,且便于处理。尤其对于数,便对系统查找来说就很直接,且便于处理。尤其对于数组(团体),可通过指针简单自加或自减,对整个数组进行处理。组(团体)
11、,可通过指针简单自加或自减,对整个数组进行处理。组(团体),可通过指针简单自加或自减,对整个数组进行处理。指针变量指针变量指针变量不要谈不要谈不要谈”指指指”色变色变色变指针是指针是指针是C C C语言学习中的一大难点。语言学习中的一大难点。语言学习中的一大难点。难难难难在概念。难在概念。难在概念。首先首先首先搞定搞定搞定*p p p 请看以下变量声明语句请看以下变量声明语句请看以下变量声明语句 intintint a,*p1;a,*p1;a,*p1;charcharchar b,*p2;b,*p2;b,*p2;a,ba,ba,b 普通变量普通变量普通变量(存放某个数值或字符存放某个数值或字符
12、存放某个数值或字符)p1,p2p1,p2p1,p2 指针变量指针变量指针变量(存放某个实体的地址存放某个实体的地址存放某个实体的地址)注意注意注意不同的不同的不同的*p p p以下程序中哪些语句是错误的?以下程序中哪些语句是错误的?以下程序中哪些语句是错误的?main()main()main()intintint a,*p;a,*p;a,*p;a=3;a=3;a=3;p=3;p=3;p=3;/*/*/*或者或者或者 p=a;*/p=a;*/p=a;*/p=&a;p=&a;p=&a;*p=a;*p=a;*p=a;/*/*/*或者或者或者*p=3*/p=3*/p=3*/有关有关有关*p p p的小
13、结的小结的小结 变量声明时,变量声明时,变量声明时,*p p p表示定义了一个用来存放变量地址而非数据(数值、字符等表示定义了一个用来存放变量地址而非数据(数值、字符等表示定义了一个用来存放变量地址而非数据(数值、字符等)的的的指针变量。指针变量。指针变量。程序中引用时,程序中引用时,程序中引用时,*p p p表示取指针变量表示取指针变量表示取指针变量p p p所指变量的值。所指变量的值。所指变量的值。*p并非就这么简单并非就这么简单并非就这么简单 *p的含义与p所指的对象有关如果如果如果p p p被定义成指向普通变量的指针变量,则被定义成指向普通变量的指针变量,则被定义成指向普通变量的指针变
14、量,则*p p p代表该变量的值。代表该变量的值。代表该变量的值。如如如 intintint *p*p*p,a=5a=5a=5;p=&a;p=&a;p=&a;则则则*p p p代表变量代表变量代表变量a a a的值的值的值(5)(5)(5)。如果如果如果p p p被定义成指向某个数组的指针变量,则被定义成指向某个数组的指针变量,则被定义成指向某个数组的指针变量,则*p p p代表该数组中某个元代表该数组中某个元代表该数组中某个元素的值。素的值。素的值。如如如 intintint *p,*p,*p,a3=1,2,3;a3=1,2,3;a3=1,2,3;p=a;p=a;p=a;则则则*p p p代
15、表数组代表数组代表数组a a a中某个元素。中某个元素。中某个元素。看看两个例子看看两个例子看看两个例子#include#include#include main()main()main()intintint a,b=10,*p;a,b=10,*p;a,b=10,*p;system(cls);system(cls);system(cls);p=&b;p=&b;p=&b;a=*p+3;a=*p+3;a=*p+3;printf(a=%d,b=%dn,a,b);printf(a=%d,b=%dn,a,b);printf(a=%d,b=%dn,a,b);main()main()main()intint
16、int *p,a12=1,2,3,4,5;*p,a12=1,2,3,4,5;*p,a12=1,2,3,4,5;clrscr();clrscr();clrscr();p=a;p=a;p=a;forforfor (;*p5;p+);*p5;p+);*p5;p+)printf(%d,*p);printf(%d,*p);printf(%d,*p);p p p指向字符数组时的指向字符数组时的指向字符数组时的*p p p如果如果如果p p p被定义成指向某个字符数组或某个字符串的指针变量,则被定义成指向某个字符数组或某个字符串的指针变量,则被定义成指向某个字符数组或某个字符串的指针变量,则*p p p代代
17、代表某个字符。表某个字符。表某个字符。如如如 intintint *p,*p,*p,a3=”abcd”;a3=”abcd”;a3=”abcd”;p=a;p=a;p=a;p p p代表代表代表a a a中的某个字符中的某个字符中的某个字符&与与与*组合使用时组合使用时组合使用时 若若若 intintint a,a,a,*p;*p;*p;p=&a;p=&a;p=&a;则则则&*p&*p&*p =&a&a&a =p;p;p;*&a*&a*&a =a a a =*p*p*p小考一下,如何?小考一下,如何?小考一下,如何?指针变量能参加运算吗指针变量能参加运算吗指针变量能参加运算吗?指针变量和其他变量一
18、样,可以在各种表达式中参加指针变量和其他变量一样,可以在各种表达式中参加指针变量和其他变量一样,可以在各种表达式中参加运算。运算。运算。但指针变量和普通变量不同但指针变量和普通变量不同但指针变量和普通变量不同,只能进行以下三种运算只能进行以下三种运算只能进行以下三种运算:赋值运算赋值运算赋值运算算术运算算术运算算术运算 指针比较指针比较指针比较指针变量的赋值运算指针变量的赋值运算指针变量的赋值运算指针变量初始化指针变量初始化指针变量初始化 变量声明时赋值变量声明时赋值变量声明时赋值典型错误典型错误典型错误指针变量定义后,未指向具体存储单元指针变量定义后,未指向具体存储单元指针变量定义后,未指向
19、具体存储单元(实体地址实体地址实体地址)就使用,此就使用,此就使用,此时指针变量所指单元是任意的时指针变量所指单元是任意的时指针变量所指单元是任意的,是个是个是个”危险指针危险指针危险指针”。为什么未指向实体的指针是为什么未指向实体的指针是为什么未指向实体的指针是“危险指针危险指针危险指针”?空指针空指针空指针 P256空指针:空指针:空指针:intintint *p;*p;*p;p=NULL;p=NULL;p=NULL;讨论讨论讨论:以下程序中的以下程序中的以下程序中的*p1,*p2p1,*p2p1,*p2指针变量的算术运算指针变量的算术运算指针变量的算术运算指针只有两种算术运算指针只有两种
20、算术运算指针只有两种算术运算加、减加、减加、减 p+5p+5p+5 p+p+p+p-1p-1p-1 p p p-注意加减运算是以实体为单位而不是以字节为单位。注意加减运算是以实体为单位而不是以字节为单位。注意加减运算是以实体为单位而不是以字节为单位。此外,两个指针变量可以相减。即:如果两个指针变量指向此外,两个指针变量可以相减。即:如果两个指针变量指向此外,两个指针变量可以相减。即:如果两个指针变量指向同一数组时,两个指针变量值之差是两个指针之间的元素个同一数组时,两个指针变量值之差是两个指针之间的元素个同一数组时,两个指针变量值之差是两个指针之间的元素个数。参见数。参见数。参见P256P25
21、6P256。但两个指针变量相加并无实际意义。但两个指针变量相加并无实际意义。但两个指针变量相加并无实际意义。以下程序哪个语句执行时会出错?以下程序哪个语句执行时会出错?以下程序哪个语句执行时会出错?#include#include#include main()main()main()intintint a10,*p1=a;a10,*p1=a;a10,*p1=a;clrscr();clrscr();clrscr();a+;a+;a+;p1+;p1+;p1+;指针的逻辑比较指针的逻辑比较指针的逻辑比较 P256 指针变量指向同一个对象(如数组)的不同单元地址时,才可以进行比较。地址在前者为小。指针
22、变量指向同一个对象(如数组)的不同单元地址时,才可以进行比较。地址在前者为小。指针变量指向同一个对象(如数组)的不同单元地址时,才可以进行比较。地址在前者为小。任何指针变量或地址都可以与任何指针变量或地址都可以与任何指针变量或地址都可以与NULLNULLNULL作相等或不相等的比较。如作相等或不相等的比较。如作相等或不相等的比较。如 if(p=NULL)if(p=NULL)if(p=NULL)*p p p:多重指针多重指针多重指针 (指向指针的指针)指向指针的指针)指向指针的指针)P251P251P251 对于对于对于 intintint *p p p;定义一个二级指针(指向指针的指针)定义一
23、个二级指针(指向指针的指针)定义一个二级指针(指向指针的指针)存放某个指针变量的地址:等效于存放某个指针变量的地址:等效于存放某个指针变量的地址:等效于 intintint *(*p)p)p)在引用时,在引用时,在引用时,*p p p是是是p p p间接指向的对象的地址。间接指向的对象的地址。间接指向的对象的地址。*p p p是是是p p p间接指向的对象的值。间接指向的对象的值。间接指向的对象的值。看了例子也许会明白的看了例子也许会明白的看了例子也许会明白的以下程序段的输出是什么?以下程序段的输出是什么?以下程序段的输出是什么?intintint *pp,*p,a=20,b=30;*pp,*
24、p,a=20,b=30;*pp,*p,a=20,b=30;pp=&p;p=&a;p=&b;pp=&p;p=&a;p=&b;pp=&p;p=&a;p=&b;printf(“%d,%dn”,*p,*pp);printf(“%d,%dn”,*p,*pp);printf(“%d,%dn”,*p,*pp);指针变量作为函数参数使用指针变量作为函数参数使用指针变量作为函数参数使用main()void swap(int,int);int a=5,b=3,*p1,*p2;clrscr();p1=&a,p2=&b;swap(*p1,*p2);printf(a=%d,b=%dn,a,b);void swap(in
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言程序设计
限制150内