第7章 指针数据类型及其应用
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第7章指针数据类型及其应用
指针是C语言中广泛使用的一种数据类型。运用指针编程是C语言最主要的风格之一。利用指针变量可以表示各种数据结构,能很方便地使用数组和字符串,并能象汇编语言一样处理内存地址,从而编出精练而高效的程序。学习指针是学习C语言中最重要的一环,能否正确理解和使用指针是能否掌握C语言的一个标志。指针极大地丰富了C语言的功能,同时,指针也是C语言中最为困难的一部分,在学习中除了要正确理解基本概念,还必须要多编程、上机调试。只要做到这些,指针也是不难掌握的。
7.1指针的概念
在计算机中,所有的数据都是存放在存储器中的。一般把存储器中的一个字节称为一个内存单元,不同的数据类型所占用的内存单元数不等,如整型占2个单元,字符型占1个单元等。为了正确地访问这些内存单元,必须为每个内存单元编上号,根据一个内存单元的编号即可准确地找到该内存单元。内存单元的编号
也叫做地址。既然根据内存单元的编号或地址就可以找到所需的内存单元,所以通常也把这个地址称为指针。对于一个内存单元来说,单元的地址即为指针。在C语言中,允许用一个变量来存放指针,这种变量称为指针变量。因此,一个指针变量的值就是某个内存单元的地址或称为某内存单元的指针。
图7.1 内存单元的地址与内容
图7.1中,设有字符变量C,其内容为’K’(ASCII码为十进制数75),C占用了011A 号单元(地址用十六进数表示)。设有指针变量P,内容为011A,这种情况称为P指向变量C,或说P是指向变量C的指针。
约定:“指针”是指地址,是常量,“指针变
量”是指取值为地址的变量。但常把指针变量简称为指针。定义指针的目的是为了通过指针去访问内存单元。
7.2指针变量的定义和引用
7.2.1指针变量的定义
变量的指针就是变量的地址。在C语言中,允许用一个变量来存放指针,这种变量称为指针变量。因此,一个指针变量的值就是某个变量的地址或称为某变量的指针。
为了表示指针变量和它所指向的变量之间的关系,在程序中用“*”符号表示“指向”,例如,i_pointer代表指针变量,而*i_pointer是i_pointer所指向的变量。如图7.2所示。
图7.2 指针变量
因此,下面两个语句作用相同:
i=3;
*i_pointer=3;
*i_pointer=3的含义是将3赋给指针变量i_pointer所指向的变量。
指针变量的定义的一般形式为:
类型说明符*变量名;
其中,*表示这是一个指针变量,变量名即为定义的指针变量名,类型说明符表示本指针变量所指向的变量的数据类型。
例如:int *p1;
表示p1是一个指针变量,它的值是某个整型变量的地址,或者说p1指向一个整型变量。7.2.2指针变量的引用
指针变量同普通变量一样,使用之前不仅要定义说明,而且必须赋予具体的值。未经赋值的指针变量不能使用,否则将造成系统混乱,甚至死机。指针变量的赋值只能赋予地址,决不能赋予任何其它数据,否则将引起错误。在C语言中,变量的地址是由编译系统分配的,对用户完全透明,用户不必知道变量的具体地址。
两个有关的运算符:
1)&:取地址运算符。&是单目运算符,其结合
性为自右至左,其功能是取变量的地址。其
一般形式为:&变量名;
2)*:指针运算符(或称“间接访问”运算符)。*是单目运算符,其结合性为自右至左,用来表示指针变量所指的变量。在*运算符之后跟的变量必须是指针变量。
例如:&a表示变量a的地址,&b表示变量b 的地址。变量本身必须预先说明。
设有指向整型变量的指针变量p,如要把整型变量a 的地址赋予p可以有以下两种方式:指针变量初始化的方法和赋值语句的方法。
int a;
int *p=&a;/*指针变量初始化的方法*/
int a;
int *p;
p=&a; /*赋值语句的方法*/
但不允许把一个数赋予指针变量,故下面的赋值是错误的:
int *p;
p=1000;
被赋值的指针变量前不能再加“*”说明符,如写为*p=&a也是错误的。
例7.1指针的定义和使用。
main()
{ int a,b;
int *pointer_1, *pointer_2;
a=100;b=10;
pointer_1=&a;
pointer_2=&b;
printf("%d,%d\n",a,b);
printf("%d,%d\n",*pointer_1, *pointer_2); }
程序运行结果如下:
100,10
100,10
例7.2使用指针,求三个数的最大值和最小值。
main()
{
int a,b,c,*pmax,*pmin; /*pmax,pmin为整型指针变量*/
printf("input three numbers:\n"); /*输入提示*/
scanf("%d%d%d",&a,&b,&c); /*输入三个数字*/
if(a>b){ /*如果第一个数字大于第二个数字...*/
pmax=&a; /*指针变量赋值*/
pmin=&b;} /*指针变量赋值*/
else{
pmax=&b; /*指针变量赋值*/
pmin=&a;} /*指针变量赋值*/
if(c>*pmax) pmax=&c; /*判断并赋值*/
if(c<*pmin) pmin=&c; /*判断并赋值*/
/*输出结果*/
printf("max=%d\nmin=%d\n",*pmax,*pmin);
}
运行结果如下:
input three numbers:
10 20 50 ↙
max=50
min=10
7.3指针与数组
一个变量有一个地址,一个数组包含若干元素,每个数组元素都在内存中占用存储单元,它们都有相应的地址。所以数组的指针是指数组的起始地址,数组元素的指针是数组元素的地址。