饶道娟第十章 指针_第1页
饶道娟第十章 指针_第2页
饶道娟第十章 指针_第3页
饶道娟第十章 指针_第4页
饶道娟第十章 指针_第5页
已阅读5页,还剩73页未读 继续免费阅读

下载本文档

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

文档简介

1、第十章第十章 指针指针主要内容主要内容地址和指针的概念地址和指针的概念变量的指针和指向变量的变量的指针和指向变量的 指针变量指针变量数组与指针数组与指针 字符串与指针字符串与指针指针数组和指向指针的指针指针数组和指向指针的指针指向函数的指针指向函数的指针返回指针值的函数返回指针值的函数本章要求:基本概本章要求:基本概念一定要清晰念一定要清晰地址和指针的概念地址和指针的概念计算机内的存储部件,程序运行时,相关指计算机内的存储部件,程序运行时,相关指令和数据都保存在内存内令和数据都保存在内存内速度快,但是掉电即失速度快,但是掉电即失可以随机访问可以随机访问只要指名要访问的内存单元的只要指名要访问的

2、内存单元的地址地址,就可以立即,就可以立即访问到该单元访问到该单元地址地址是一个无符号整数是一个无符号整数内存中的每个字节都有唯一的一个地址内存中的每个字节都有唯一的一个地址地址按字节编号,按类型分配空间地址按字节编号,按类型分配空间内存地址内存地址访问变量的方式访问变量的方式如何读写内存中的数如何读写内存中的数据?据?通过变量的地址访问变通过变量的地址访问变量所在的存储单元量所在的存储单元C语言访问变量的方式语言访问变量的方式直接访问直接访问 直接按变量地址来存直接按变量地址来存取变量内容的访问方取变量内容的访问方式式间接访问间接访问 通过指针变量来间接通过指针变量来间接存取它所指向的变量存

3、取它所指向的变量的访问方式的访问方式 0 内存用户数据区 2000 3 变量i 2002 6 变量j 2004 9 变量k 3010 2000 变量i_pointer 例:用变量 i_pointer 来存放变量 i 的地址。如果要得到 i 的值,先访问变量 i_pointer ,得到 i_pointer 的值为2000(该值是变量 i 的地址),再通过地址 2000 找到所指存储单元中的值(i 的值),见图。 3变量变量i_pointeri200020003010一个变量的地址称为该变量的“指针指针”。例如,地址2000是变量的指针。如果有一个变量专门用来存放另一变量的地址(即指针),则它称为

4、“指针变量指针变量”。上述的i_pointer就是一个指针变量。指针和指针变量的定义:指针和指针变量的定义:变量的变量的指针和指针和指向变量的指向变量的指针变量指针变量指针的概念指针的概念指针也是一种数据类型指针也是一种数据类型指针变量指针变量 具有指针类型的变量,专门存放地址数据的变量具有指针类型的变量,专门存放地址数据的变量 变量的指针变量的指针 变量的地址变量的地址指针变量的定义指针变量的定义 一般形式为一般形式为 基类型基类型 *指针变量名;指针变量名; 例:例:int *p; 定义了一个指针定义了一个指针变量变量p,简称指针,简称指针p p是变量,是变量,int*是类型是类型 p可用

5、于存放地址。尚未初始化,随机值。危险!指向一个可用于存放地址。尚未初始化,随机值。危险!指向一个不确定的地址。不确定的地址。 指针变量初始化指针变量初始化 int a,*p=&a; *p就像普通的变量一样使用,其值是就像普通的变量一样使用,其值是p指向的内存的内容指向的内存的内容(在此例中和(在此例中和a等价,但寻址方式不同)等价,但寻址方式不同) p可以动态(任意)地指向不同内存,从而使可以动态(任意)地指向不同内存,从而使*p代表不同的代表不同的变量变量int i,*p;p=&i; int *p;float *q;p=q;int i;float *p;p=&i;in

6、t *p;p=100;指针变量只指针变量只存放地址存放地址!一个指针变量不能一个指针变量不能指向与其类型不同指向与其类型不同的变量的变量!我是真的,我是真的,你猜对了吗?你猜对了吗?应在类型相应在类型相同的指针变同的指针变量之间赋值量之间赋值指针变量的引用指针变量的引用 例例. 通过指针变量访问其所指的变量通过指针变量访问其所指的变量#include void main()int a,b;int *pointer_1, *pointer_2;a=100;b=10;pointer_1=&a; pointer_2=&b; printf(%d,%dn,a,b);printf(%d,%

7、dn,*pointer_1,*pointer_2);对对“”和和“*”运算符说明运算符说明 优先级、结合性:优先级、结合性: 已知:已知:int a,b;int *pointer_1, *pointer_2;pointer_1=&a;pointer_2=&b;则:则: * pointer_等价于等价于 pointer_2 * pointer_ ; pointer_2原来指向,经过重新赋值后它已不再指向了,原来指向,经过重新赋值后它已不再指向了,而指向了。而指向了。 *等价于等价于 (*pointer_)+等价于等价于例例2.输入和两个整数,按先大后小的输入和两个整数,按先大后小

8、的顺序输出和。顺序输出和。#include void main()int *p1,*p2,*p,a,b;scanf(%d,%d,&a,&b); printf(a=%d,b=%dnn,a,b);p1=&a;p2=&b; if(a q p q p = q指针不与非指针量进行比较,但可与指针不与非指针量进行比较,但可与NULL(即即0值值)进进行等或不等的关系运算行等或不等的关系运算 判断判断p是否为空指针是否为空指针 P = NULL p != NULL指针运算指针运算赋值运算赋值运算指针在使用前一定要赋值指针在使用前一定要赋值为指针变量赋的值必须是一个地址为指针变

9、量赋的值必须是一个地址void main() int *p; scanf(%d,p); 错!数组与指针数组与指针 难点:二维数组的地址和指针的概念难点:二维数组的地址和指针的概念指向数组元素的指针指向数组元素的指针一个变量有地址,那么一个数组包含若干元素,一个变量有地址,那么一个数组包含若干元素,每个数组元素都在内存中占用存储单元,它们每个数组元素都在内存中占用存储单元,它们都有相应的地址。都有相应的地址。指针变量既然可以指向变量,当然也可以指向指针变量既然可以指向变量,当然也可以指向数组元素(把某一元素的地址放到一个指针变数组元素(把某一元素的地址放到一个指针变量中)。所谓量中)。所谓数组元

10、素的指针就是数组元素的数组元素的指针就是数组元素的地址地址。2022-3-313560006001600260036004600560066007a0a1a2a3aa+1a+260006001600260036004600560066007a0a1a2a3app+p+几点说明:几点说明: 为下标运算符,对于一维数组,为下标运算符,对于一维数组,ai按按a+i计计算地址,然后找出该地址单元的值算地址,然后找出该地址单元的值int *p, a10;p = a;其中其中a为指针常量,为指针常量,p为指针变量;为指针变量;p值可以修改,值可以修改,a不可修改。不可修改。2022-3-3137 区分:区

11、分:*p+ (*p)+ *(p+)*(+p) int *p, a10;p = a; *p+ 等价于等价于 *(p+)即先即先*p,再,再p+使用使用a0的值,然后的值,然后p指向指向a1 (*p)+ 即即(a0)+ *(p+)见见1 *(+P)即先即先p+,再,再*p1.p指向指向a1,然后使用,然后使用a1的值的值一维数组作函数参数一维数组作函数参数(例:(例:10.7-10.9)主调函数主调函数被调函数被调函数int *p, a10;p = a;f(a,10) void f(int array,int n)f(p,10)void f(int *array,int n)2022-3-3140

12、a00a01a02a10a11a12aa0+0a+1a1+0a0+1a0+2&a00&a10&a11a1+1&a12&a01&a02 a00 a0a01a02a10 a1 a11a12 a a1+2 a23;2022-3-3141一维数组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 a2+3a1+0 a1+1 a1+2 a1+3一维数组a2一维数组a1一维数组a0a0 a2 a+0 &a0

13、a+1 &a1 a+2&a2 2022-3-31422022-3-31432022-3-3144a00a01a02a10a11a12pp+2022-3-3145a00a01a02a10a11a12pp+二维数组作函数参数二维数组作函数参数(例:(例:10.13-10.14)用指向数组元素的指针变量(列指针)用指向数组元素的指针变量(列指针)主调函数主调函数被调函数被调函数int a34,*p;p = a0;f(a0,12)void f(int *p,int n)f(*a,12)f(p,12)二维数组作函数参数二维数组作函数参数(例:(例:10.13-10.14)用指向一维数组的

14、指针变量(行指针)用指向一维数组的指针变量(行指针)主调函数主调函数被调函数被调函数int a34,(*p)4;p = a;f(a,3) void f(int array4,int n)f(p,3) void f(int (*p)4,int n)字符串与指针字符串与指针复习:复习:字符串字符串(String)与字符数组与字符数组字符串字符串一串以一串以0结尾的字符在结尾的字符在C语言中被看作字符串语言中被看作字符串用双引号括起的一串字符是字符串常量,用双引号括起的一串字符是字符串常量,C语言自动语言自动为其添加为其添加0终结符终结符C语言并没有为字符串提供任何专门的表示法,完全语言并没有为字符

15、串提供任何专门的表示法,完全使用字符数组和字符指针来处理使用字符数组和字符指针来处理字符数组字符数组每个元素都是字符类型的数组每个元素都是字符类型的数组例如:例如: 一维:一维: char string80; 二维:二维: char string380;字符数组的初始化字符数组的初始化用字符型数据对数组进行初始化用字符型数据对数组进行初始化 char str6 = C,h,i,n,a,0; 字符数组并不要求最后一个字符为字符数组并不要求最后一个字符为0用字符串常量直接对数组初始化用字符串常量直接对数组初始化 char str6 = China; char str6 = China;逐个输入输出

16、逐个输入输出(getchar(),putchar(ch)/%c)for (i=0; si!=n; i+) si=getchar();for (i=0; si!=0; i+) putchar(si);putchar(n);scanf(%s,s); printf(%s,s);char s10;gets(s); puts(s);注:注:gets()puts()函数具体函数具体用法参见字符串处理函数用法参见字符串处理函数一次性输入输出一次性输入输出字符数组的输入与输出字符数组的输入与输出字符指针字符指针字符串与字符数组、字符指针字符串与字符数组、字符指针 字符串字符串 字符数组字符数组 字符指针字符指

17、针 指向字符类型的指针指向字符类型的指针 char* p; 数组和指针可以等同看待,上面三者本质上是一回事数组和指针可以等同看待,上面三者本质上是一回事字符指针变量与字符数组的区别字符指针变量与字符数组的区别 定义方法不同定义方法不同 char str10; 赋值方法和含义不同赋值方法和含义不同char str10; ptr = ”china”; /*错误错误*/ strcpy(str,”china”); /*正确正确*/ char *ptr;char *ptr; ptr = ”china”;字符指针变量与字符数组的区别字符指针变量与字符数组的区别 在定义一个数组时,在编译时即分配单元,有确定

18、地址,在定义一个数组时,在编译时即分配单元,有确定地址,而定义一个字符指针变量时,如未对它赋初值,则其而定义一个字符指针变量时,如未对它赋初值,则其所所指数据指数据是不定的,因而使用是是不定的,因而使用是危险危险的。的。 例如,输入字符串时例如,输入字符串时 char str10; scanf(%s, str); /*正确正确*/ char *a; scanf(%s, a); /*错误错误*/ 应为:应为: char *a,str10; a = str; scanf(%s, a); /*正确正确*/字符指针变量与字符数组的区别字符指针变量与字符数组的区别 初始化含义不同初始化含义不同char

19、str14 = ”china”;不等价于不等价于 char str14; str = ”china”;char *pstr = ”china”; 等价于等价于 char *pstr; pstr = ”china”;字符指针是变量,而数组名是地址常量字符指针是变量,而数组名是地址常量2022-3-31582022-3-3159下标: 0 1 2 3 4 5 6 7 8 9 10 11 HelloChina0HelloChina0fromitoi下标移动方向toi=0fromto结束拷贝ii+i HelloChina0HelloChina0*from* to指针移动方向指针移动方向*to=0tof

20、rom+fromfromto+to2022-3-3160指针数组和指向指针的指针指针数组和指向指针的指针2022-3-31622022-3-31632022-3-3164 name0 P a s c a l 0 0 0 0 name1 B a s i c 0 0 0 0 0 name2 F o r t r a n 0 0 0 name3 J a v a 0 0 0 0 0 0 name4 V i s u a l C 0 0 name0 B a s i c 0 0 0 0 0 name1 F o r t r a n 0 0 0 name2 J a v a 0 0 0 0 0 0 name3 P

21、a s c a l 0 0 0 0 name4 V i s u a l C 0 0 2022-3-31652022-3-3166指针数组ptr 字符串排序前Pascal0Basic0Fortran0Java0Visual C0ptr0ptr1ptr2ptr3ptr4指针数组ptr 字符串排序后Pascal0Basic0Fortran0Java0Visual C0ptr0ptr1ptr2ptr3ptr42022-3-31672022-3-3168 变量 ipp 变量 ip 变量 i &ip &i *ipp *ipp 5 &ip &i 2022-3-3169PascalBasicFortranJavaptr指针数组指针数组字符串字符串pVisual C2022-3-31702022-3-3171echo.exeprogrammingisfunptr指针数组指针数组字符串字符串name返回指针值的函数返回指针值的函数定义:定义:数据类型数据类型 *函数名函数名(参数表参数表) 例:有若干个学生的成绩(每个学生有门课例:有若干个学生的成绩(每个学生有门课程),要求在用户输入学生序号以后,能输出程),要求在用户输入学生序号以后,能输出该学生的全部成绩。该学生的全部成绩。#include float *

温馨提示

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

评论

0/150

提交评论