版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第11章指针11.1变量的指针11.2指针变量11.3指针变量的使用11.4指针与数组11.5字符串与指针11.6指向函数的指针11.7返回指针值的函数11.8指针数组11.9链表11.10有关指针的数据类型小结
11.1变 量 的 指 针
为了正确地访问这些内存单元,必须为每个内存单元编号。根据一个内存单元的编号就可以准确地找到该内存单元。因此内存区的每一个字节都有一个编号,这就是地址,通俗地说,它相当于旅馆中的房间号;在地址所标志的内存单元中存放数据,这就相当于每个房间中居住旅客一样。内存单元的地址与内容两个概念的区别如图11.1所示。图11.1内存用户数据区数据存储示例
【例11-1】显示变量的值及地址。图11.2例11-1运行结果
11.2指针变量
1.间接访问形式
假设定义了一个变量i_pointer,用来存放整型变量的地址,它被分配内存地址为3010、3011的字节单元。可以通过下面的语句将i的地址(2000)存放到i_pointer中:
i_pointer=&i;
2.间接访问方式和直接访问方式的对比
例如,为了打开A抽屉,有两种办法:一种是将A钥匙随身携带,需要时直接找出该钥匙打开抽屉,取出所需的东西;另一种办法是将A钥匙放到另一抽屉B中锁起来。如果需要打开A抽屉,就需要先找出B钥匙,打开B抽屉,取出A钥匙,再打开A抽屉,取出A抽屉中的物品,这就是间接访问。
图11.3是直接访问和间接访问的示意图。图11.3直接访问和间接访问的示意图
3.间接访问运算符“*”
为了表示指针变量和它所指向的变量的联系,在程序中用“*”符号表示“指向”关系。例如,i_pointer代表指针变量,而*i_pointer是i_pointer所指向的变量,如图11.4所示。图11.4指针变量示意图
11.3指针变量的使用
11.3.1指针变量的定义
C语言规定所有变量在使用前必须定义,指定其类型,并按此分配内存单元。指针变量不同于整型变量和其他类型的变量,它是专门用来存放地址的,必须将它定义为指针类型。那么指针变量该如何定义呢?例如:
inti,j;
int*pointer_1,*pointer_2;图11.5将变量地址存放到指针变量中11.3.2指针变量的引用
指针变量中只能存放地址(指针),不要将一个整型量(或任何其他非地址类型的数据)赋给一个指针变量。例如,下面的赋值是不合法的:
pointer_1=100;
/*pointer_1是指针变量,100为整数*/
【例11-2】通过指针变量访问整型变量。图11.6例11-2运行结果图11.7例11-2示意图11.3.3运算符“&”和“*”的结合方向
【例11-3】输入a和b两个整数,按先大后小的顺序输出a和b。图11.8例11-3的运行结果代码说明:当输入a=2,b=9时,由于a<b,将p1和p2交换。交换前的情况如图11.9(a)所示,交换后的情况如图11.9(b)所示。图11.9p1和p2交换前后示意图11.3.4指针变量作函数参数
【例11-4】输入两个整数,按大小输出(指针变量作函数参数)。图11.10例11-4运行结果图11.11例11-3执行过程中变量交换示意图图11.12值的单向传递图11.13变量交换示意图11.4指 针 与 数 组
11.4.1指向数组元素的指针
定义一个指向数组元素的指针变量的方法,与前面介绍的指向变量的指针变量相同。例如:
inta[10];/*定义a为包含10个整型数据的数组*/
int*p;/*定义p为指向整型变量的指针变量*/下面是给指针变量p赋值:
p=&a[0]; /*将a[0]元素的地址赋给指针变量p,
也就是说,指针变量p指向 数组下标
为0的元素,如图11.14所示*/图11.14指向数组元素的指针11.4.2通过指针引用数组元素
假设p已被定义为指针变量,并已给它赋了一个地址,使它指向某一个数组元素。如果有以下赋值语句:
*p=1;
表示对p当前所指向的数组元素赋予一个值(值为1)。图11.15通过指针引用数组元素
【例11-5】使用指针变量来计算数组中所有元素的总和。图11.16例11-5运行结果11.4.3指向二维数组的指针变量
1.二维数组的地址表示
二维数组的首地址是这片连续存储空间的起始地址,它既可以用数组名表示,也可以用数组中第一个元素的地址表示。假设有如下定义:
inta[3][4]={{1,3,5,7},{9,11,13,15},{17,19,21,23}};
2.二维数组的指针变量
二维数组指针变量的一般形式如下:
基类型(*指针变量名)[长度]
【例11-6】输出二维数组任一行任一列元素的值。图11.17例11-6运行结果
11.5字符串与指针
11.5.1用字符数组表示字符串
将字符串的各个字符(包括串结束标志 '\0')依次存放到字符数组中,利用下标变量对数组进行操作。
【例11-7】定义一个字符数组,对它进行初始化,然后输出该字符串。图11.18例11-7运行结果11.5.2用字符指针表示字符串
对字符串而言,可以不定义字符数组,而是直接定义指向字符串的指针变量,利用该指针变量对字符串进行操作。
【例11-8】定义一个字符型指针变量,并对它进行初始化,然后输出该字符串。图11.19例11-8运行结果图11.20字符指针处理字符串【例11-9】使用字符指针来确定字符串的长度。图11.21例11-9运行结果
11.6指向函数的指针
与变量一样,函数在内存中也需要存储地址。C语言允许定义一个指向函数的指针。该指针又可以作为一个参数在另一个函数中使用。
(1)指向函数的指针变量的定义:
数据类型(*指针变量名)();
这里的数据类型是指函数返回值的类型。
(2)指向函数的指针变量的赋值:
指针变量名=函数名;
表示将函数的入口地址赋给指针变量。
(3)使用指针变量调用函数:
(*指针变量名)(实际参数列表)
使用指向函数的指针变量调用函数时,只需用(*指针变量名)代替函数名即可。
【例11-10】函数指针的综合示例:使用函数指针作为函数参数。图11.22例11-10运行结果
11.7返回指针值的函数
一个函数可以带回一个整型值、字符值、实型值等,也可以带回指针型的数据,即地址。这个概念与返回整型、字符型、实型值的函数概念类似,只是返回的值是指针类型
而已。
返回指针类型数据的函数定义的一般形式如下:
类型名 *函数名(参数列表)
【例11-11】返回指针值的函数。图11.23例11-11运行结果
11.8指针数组
11.8.1指针数组的概念
一个数组,其元素均为指针类型的数据,就称为指针数组,也就是说,指针数组中的每一个元素都是一个指针变量。一维指针数组定义的形式如下:
类型名*数组名[数组长度]例如:
int*p[4]; /*定义了一个一维指针数组p,包含4个整型指针*/
char*q[5]; /*定义了一个一维指针数组q,包含5个字符型指针*/图11.24字符串数组与指针数组存储字符串对比
【例11-12】将若干个字符串按字母顺序(由小到大)输出。图11.25例11-12运行结果11.8.2指针数组作main函数的形参
指针数组的一个重要应用是作为main函数的形参。在以往的程序中,main函数的第一行一般写成以下形式:
main()
括号中是空的。实际上,main函数可以有形参,其参数形式如下所示:
main(intargc,char*argv[])命令行的一般形式为
命令名参数1参数2…参数n
命令名和各参数之间用空格分隔。例如,若有一目标文件名为file1,要将两个字符串“China”,“Beijing”作为传送给main函数的参数,可以写成以下形式:
file1ChinaBeijing图11.26main函数的参数
【例11-13】指针数组作main函数的形参。图11.27例11-13运行结果
11.9链表
11.9.1链表概述
1.单链表结构
链表根据需要开辟内存单元。图11.28表示最简单的单向链表的结构。图11.28单链表结构
2.链表中结点的结构
可以看到,链表结点中要存放下一元素的地址,必须利用指针变量才能实现。第10章介绍的结构体变量,用它作链表中的结点是最合适的。一个结构体变量包含若干个成员,这些成员可以是数值类型、字符类型、数组类型,也可以是指针类型。例如,可以设计这样一个结构体类型:图11.29单链表结点结构11.9.2处理动态链表所需的函数
链表是动态地分配存储的,即在需要时才开辟一个结点的存储单元,不需要时释放结点空间。怎样动态地开辟和释放存储单元呢?C语言编译系统的库函数提供了以下有关
函数:
(1) malloc函数。其函数原型为:
void*malloc(unsignedintsize);
(2) calloc函数。其函数原型为:
void*calloc(unsignedn,unsignedsize);
(3) free函数。其函数原型为:
voidfree(void*p);
(4) realloc函数。其函数原型为:
void*realloc(void*ptr,unsignedintsize)
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年度跨境电商仓储租赁合同合法经营拓展全球市场4篇
- 二零二五年度建筑工地钢筋施工安全培训合同
- 二零二五版网络短视频剪辑师招聘合同范本3篇
- 二零二五年度建筑用沙子购销及环保审计合同3篇
- 2025年皮包原材料进口合同二零二五年度版4篇
- 二零二五年度拍卖会筹备及组织服务合同4篇
- 2025年度牛羊肉品牌保护及侵权纠纷处理合同
- 二零二五年度内墙抹灰工程质量监督合同范例
- 二零二五版摩托车二手车交易评估与收购合同4篇
- 2025年建筑物清洁与智能安防系统维护合同3篇
- 2024-2025学年北京石景山区九年级初三(上)期末语文试卷(含答案)
- 第一章 整式的乘除 单元测试(含答案) 2024-2025学年北师大版数学七年级下册
- 春节联欢晚会节目单课件模板
- 中国高血压防治指南(2024年修订版)
- 糖尿病眼病患者血糖管理
- 抖音音乐推广代运营合同样本
- 教育促进会会长总结发言稿
- 北师大版(2024新版)七年级上册数学第四章《基本平面图形》测试卷(含答案解析)
- 心理调适教案调整心态积极应对挑战
- 小学数学6年级应用题100道附答案(完整版)
- 喷漆外包服务合同范本
评论
0/150
提交评论