第八章  指针的使用
【学习目标】
本章将详细介绍在C语言中如何使用指针。学习要点包括如下几点:
1掌握指针和指针变量的概念,了解指针变量的特点以及直接访问数据和间接访问数据的原理。
2掌握指针变量的定义、赋值方法及指针运算符的使用,熟练运用指针访问简单变量
3熟悉指针和一维数组的关系,掌握指向一维数组的指针变量的定义方法,熟练使用指针变量访问一维数组元素。
4了解指针与字符串的关系,能熟练使用指针处理字符串。
5熟练掌握用指针变量作函数的参数时函数的定义和调用方法、数组名作函数的参数用法。
6)指向指针的指针的运用。
【学习导航】
本章的在整个课程中的位置如图5-1所示。
8-1  本章学习导航


    在本书的第一章介绍C语言有一个灵活性的特点,那么它的灵活性具体体现在哪里呢?其实就是指针。指针是C语言的精华部分,通过利用指针,我们能很好地利用内存资源,使其发挥最大的效率。有了指针技术,我们可以描述复杂的数据结构,对字符串的处理可以更灵活,对数组的处理更方便,使程序的书写简洁,高效。   
8.1 地址和指针
    指针是C语言的一种数据类型,类似于整型、字符型等。既然指针也是一种类型,那么也可以定义该类型的变量,称为指针变量。
    指针变量和其他类型的变量的区别是:指针变量存储的是地址。所以要学好指针,就一定要明白数据在内存中是如何存储的。
    计算机所有数据都是存储在存储器里,系统的内存可看作编了号的小房间,如果要取房间的东西(读取数据)就需要得到房间编号。地址就是内存区中对每个字节的编号。下面通过两个整型变量来说明。
    int x = 1, y =2;
    整型变量x、y(基本整型需4个字节)在内存中的存储如图8-2所示(假设内存编号是从2000开始)。把变量所占用的存储单元首字节的地址作为变量的地址。C语言中利用取地址运算符“&”获取变量的存储地址。例如,&c将返回c的首地址;&x将返回x的首地址。
8-2 变量xy在内存中的存储
    图8-2中2000H和2004H就是内存单元的地址。对内存中变量的访问,用scanf("%d%d ",&x,&y) 表示将数据输入变量的地址所指示的内存单元。那么,访问变量,首先应到其在内存的地址,或者说,一个地址唯一指向一个内存变量,我们称这个地址为变量的指针。
如果将变量的地址保存在内存的特定区域,用变量来存放这些地址,这样的变量就是指针变量,通过指针对所指向变量的访问,也就是一种对变量的“间接访问”。
    指针是什么呢?可以看作是内存中的一个地址。这个地址是内存中另一个变量的位置。在图8-2中,变量x的地址是2000H,就可以称为x的“指针”。
  知识链接变量的直接访问和间接访问
C语言中,访问变量的值有两种方式——直接访问和间接访问
变量的“直接访问”方式:按变量名(即变量的地址)存取变量值的方式。比如在图8-3中直接访问x
变量的“间接访问”方式:将变量的地址放在另一个内存单元中,先到另一个内存单元中取得变量的地址,再由变量的地址到变量并进行数据存取。比如在图8-3中直接访问p
8-3 直接访问和间接访问
8.2  指针变量的定义与引用
8.2.1  指针变量的定义和赋值
1.定义
指针变量的定义格式如下:
类型说明 * 变量名
指针变量的定义格式其中“*”表示这是个指针变量,变量名表示定义的指针变量的名称,类型说明表示指针变量所指向的变量的数据类型。例如:
int * p; 
表示定义了一个名称为p的指针变量(注意变量名不是*p),它指向的变量的数据类型是int。
2.赋值
指针变量和普通变量一样,使用之前必须赋值,未经赋值的指针变量不可使用。给指针变量只能给它赋值地址,而不能赋予任何其他数据。C语言中提供了地址运算符“&”来表示变量的地址,其一般形式为:
&变量名
比如&x表示变量x的地址。
指针变量的赋值可以按下面的方式:
1 int * p;
2 int x =5;
3 p = &x;
4 printf("%d\n",*p);
试一试(一)
将上面的3行代码改成:
p = x;
能通过编译吗?运行结果是什么?
【说明】
编译时会出现警告:'int *' differs in levels of indirection from 'int ',意思是int *(p变量的数据类型)和int(x变量的数据类型)不匹配。运行结果会报错,如图8-4所示:
图8-4 指针变量p初始化错误1
从上面的错误可以看出,整数5被编译器当作了地址(0x00000005)。而当第4行输出p指
向的变量的值,报出不能读取的错误,因为0x00000005不是本程序分配的地址。所以从安全性方面的考虑,会不允许这个读取操作。
试一试(二)
将第3行代码改成:
*p = x;
能通过编译吗?运行结果是什么?
【说明】
    编译时会出现警告:local variable 'p' used without having been initialized。意思是变量p在使用前没有初始化。显然,*p=x这条语句只给*p赋了值,而并没有给变量p赋值。运行后会报错,如图8-5所示。
图8-5 指针变量p初始化错误2
这是因为指针变量p没有赋初值,所以它指向的是一个系统给的不知名的地址(在这次执行时系统分配的是0xcccccccc,虽然p的空间本程序有控制权,但是地址0xcccccccc本程序并没有控制权。出于安全性考虑,系统禁止向这个地址写入值(*p = x),所以报错。
试一试(三)
下面的代码编译会有问题吗?
1 int *p;
2 double x =5.0;
3 p = &x;
【说明】第1行定义了指针变量p,它指向的变量的数据类型为int。而在第3行给它赋的值是一个double型的地址。所以会报警告:incompatible types - from 'double *' to 'int *'。
8.2.2  指针变量的引用
1.指针变量的引用
引用指针变量,是提供对变量的一种间接访问形式。对指针变量的引用形式为:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。