- 1、本文档共73页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第七章 指针数据类型;学习目标;第七章 指针数据类型;变量的四大基本特征
名称:用于在程序中标识和访问(使用)变量,由用户自定义
类型:变量所属的数据类型
地址:数据对象的存储位置在计算机中的编号
值:在该位置处存储的内容
内存空间的访问方式
通过变量访问
通过地址访问;在C语言中,用指针类型来描述内存地址,通过指针运算来实现与内存地址有关的程序功能。
使用指针增加了程序设计的灵活性,提高了程序的效率。
;指针变量的概念;指针的定义格式
格式:目标数据对象类型 * 指针变量名称;
其中,<目标数据对象类型 >为<指针变量>所能指向的数据的类型。
例一:定义 p 为指向整数的指针:int * p;
例二:定义 p 为指向结构体类型的指针:typedef struct{ int x, y; } POINT; POINT * p;
多个指针变量的定义
例三: int * p, * q;
例四:typedef int * PINT; PINT p, q;;取址操作符“&”
获取数据对象的地址,可将结果赋给指针变量
示例:int n = 10; 则 &n 表示变量n在内存中的起始地址。;仅定义指针变量,未初始化
例一:int * p;
定义指针变量,并使其指向某个目标变量
例二:int n = 10; int * p = &n;;定义指针变量,并使其指向数组首元素
例三:int a[8] = {1, 2, 3, 4, 5, 6, 7, 8}; int * q = a;
空指针:地址值为0,专用于表示未指向任何数据;地址值0可用NULL表示;
例四:int *p=NULL;;指针变量可以像普通变量一样赋值
示例:int n = 10; int * p = &n, * q; q = p;
两个指针指向同一个目标数据对象;赋值操作时应注意目标数据类型应符合指针类型定义
int x,*p,*p1;
double y,*q;
......
p = &x; //OK,p指向x。
q = &y; //OK,q指向y。
p = &y; //Error,类型不一致。
q = &x; //Error,类型不一致。
p1 = p; //OK,p1指向p所指向的变量。
p1 = q; //Error,类型不一致。
p = 0; //OK,使得p不指向任何变量。
p = 120; //Error,120为int型。
p = (int *)120; //OK,不建议使用。
;引领操作符“*”
获取指针所指向的目标数据对象,即间接访问
例一:int m, n = 10; int * p = &n; m = *p;
使得 m 为 10
例二(接上例):*p = 1;
使得 n 为 1;编写程序,使用指针互换两个整数的值;第七??语句执行前;第七条语句执行后;第八条语句执行后;第九条语句执行后;编写程序,使用指针互换两个整数的值;第七条语句执行后;第八条语句执行后;第九条语句执行后;作为函数通信的一种手段
使用指针作为函数参数,不仅可以提高参数传递效率,还可以将该参数作为函数输出集的一员,带回结果
作为构造复杂数据结构的手段
使用指针构造数据对象之间的关联,形成复杂数据结构
作为动态内存分配和管理的手段
在程序执行期间动态构造数据对象之间的关联;第七章 指针数据类型;数据交换函数
常量指针与指针常量
返回指针的函数;编写程序互换两个整型数据对象的值,要求使用函数实现数据对象值的互换;编写程序互换两个整型数据对象的值,要求使用函数实现数据对象值的互换;;;;;特别说明:不能返回函数内部定义的局部变量地址
例如:
int *f()
{ int i=0;
return &i;
}
int main()
{ int *p=f();
......
printf(“%d”, *p); //输出什么?
return 0;
};第七章 指针数据类型;指针与数组
数组元素地址的计算
作为函数参数的指针与数组
指针与数组的可互换性;数组定义
int a[8] = {1, 2, 3, 4, 5, 6, 7, 8};
数组基地址:&a或 a或&a[0]
数组元素地址
数组首元素地址:&a[0]
数组第 i 元素地址:&a[0] + i * sizeof( int )
数组基地址与首元素地址数值相同,故
数组第 i 元素地址:a + i * sizeof( int );数组元素的地址
数组定义:int a[8] = {1, 2, 3, 4, 5, 6, 7, 8};
指针定义:int * p; p = &a[0]; // p 指向数组首元素
指针定义:int * p; p = a; // p 仍指
文档评论(0)