总纲
一、指针定义
二、指针种类和定义与使用指针
三、指针变量的作用
一、指针定义
-
指针简单定义:所谓指针简单地可以理解为导航器。
变量名使用变量:在计算机中内存我们可以看成一栋巨大公寓,程序运行过程中你需要使用变量来储存运行时产生的数据,你就需要在公寓找一间房间存放数据,住房需要登记,登记需要身份证,有身份证就知道你个变量姓名是什么,这个姓名就是这个变量的变量名。我们运行时需要用到这个变量时,计算机先需要找到这个变量,我们如果直接使用变量名来使用这个变量,计算机其实是通过住进房间里的变量的姓名来找到这个变量。
地址:你不需要某个变量,那你这变量就要从公寓搬出来让给其他后来需要的变量住。你这个变量走了,房间不会拆除,还在公寓里,那房间一直在那就要给公寓里每一个房间起一个房间号,以便好安排房间,这个房间号就是这件房间的地址。
指针:指针就是导航器,而它对应的定位器可以改变,定位器可以安装在不同房间。计算机可以用指针这个导航器直接导航到指定房间访问这个房间里的变量。 -
指针精确定义
指针:地址指向变量单位,将地址形象化称为“指针”。指向是通过地址体现的。
指针变量:一个专门用来存放另一变量地址(指针)的变量。指针变量的值是地址(即指针)。
二、指针种类
1.指向基本类型的指针变量
基本类型如下:
类型 | 对应指针变量 |
---|---|
基本整型 | int * |
短整型 | shout int * |
长整型 | long int * |
双长整型 | long long * |
字符型 | char * |
布尔型 | bool * |
单精度浮点型 | float * |
双精度浮点型 | double * |
一个变量的指针的含义包括两个方面,一是以存储单元编号表示的纯地址(如编号为2000的字节),一是它指向的存储单元的数据类型(如int,char,float等)。指针类型:如指向整型数据的指针类型表示为“int * ”,读作“指向int的指针”或简称“int指针”。
定义指针变量时指针类型很重要,定义指针为什么类型就只能将指针指向什么类型的数据。因为当计算机通过指针访问变量时会根据指针类型来对内存采取不同的访问方式,若类型不相同会访问到错误数据。
-
定义指向基本类型数据的指针变量
类型名 * 指针变量名 -
赋值
运用取地址符给指针变量赋值(p为一个int指针,a为基本整型变量)
p=&a; //把a的地址赋给指针变量p
注意:
不可以直接将一个数值赋给指针变量(如p=1000)
定义一个指针变量后一定要给它赋值才可以使用它,若没有给它赋值就使用它很容易破坏计算机其他程序。
- 引用指针变量
“ * ” 指针运算符
- p=1; // * p即表示指针p指向的变量,可以对它运算赋值,改变p指向变量的值。
2.指向数组的指针变量
-
一个数组名其实就是一个地址,为数组第一个元素的地址
-
指针运算(p为一个float指针,且已指向数组某一元素)
p+1:表示指向同一数组中的下一元素,地址加上一个数组元素所占用的字节数,如p为float指针则值加4
p-1:表示指向同一数组中的上一元素,地址减去一个数组元素所占用的字节数
p1-p2:(当p1、p2均指向同一数组元素时)表示两个指针指向的数组元素相差元素的个数 -
对于num[n]的处理,计算机是将它转换为*(num+n)来处理的
-
指向字符数组的指针
可以通过指向字符数组元素的指针输出该字符元素
可以通过指向字符数组第一个元素用输出函数输出整个字符串
字符串常量按数组来处理,可以用字符指针引用,输出该字符串。
3.指向多维数组指针
-
指向二维数组一行一维数组的指针
二维数组数组变量名也是一个的地址,数值上也是数组第一个元素的地址,但它指向的是二维数组第0行一维数组。如二维数组num[3][3],num数组名是一个地址,它指向的是第0行一维数组,num+1则指向的是第1行一维数组。 -
运用数组下标是指向二维数组第一个元素的指针指向数组中某一特定元素
如定义二维数组num[4][4],则对于数组元素num[i][j]可以使p=p+4*i+j,此时指针p就指向元素num[i][j],可以通过指针p访问num[i][j]。 -
p为指向由m个元素组成的一维数组
定义:类型名 (*p)[m]
注意:与 类型名 * p[m] 区别 (定义指针数组)
指针变量p的值虽是该一维数组第一个元素的地址,但它指向的是这整个一维数组。
可以用p输出该一维数组的元素
#include<stdio.h>
int main()
{
int a[4] = { 1,3,5,7 };
int(*p)[4]; //定义指向包括4个元素的一维数组的指针变量
p = &a; //使p指向一位数组
printf("%d\n", (*p)[3]); //输出a[3],输出整数7
return 0;
}
4.指针数组
- 定义指针数组:类型名 * 数组名[数组长度]
表示该数组有多个指针变量,每个指针变量均只能指向对应类型数据
5.指向函数的指针
- 定义:类型名 ( * 指针变量名)(函数参数表列)
如:int ( * p)(int,int)
表示这是一个指针变量,且这个指针变量是指向一个有两个基本整型参数且返回值是基本整型的函数 - 运用指向函数的指针:
int max(int, int);
int (*p)(int, int);
p = max;//将函数入口地址赋给p
c = (*p)(a, b);//调用max函数等同于c=max(a,b)
函数名代表函数的起始地址,这个地址就是函数的入口。
6.返回指针值的函数
- 定义:类型名 * 函数名(参数列表)
表示该函数返回的是一个指定类型的指针变量
7.void 指针类型
- void类型应理解它指向的是空类型或不指定的类型,切记不能理解为能指向任何的类型
- void类型指针多用在调用开辟动态存储区函数时其返回值和形参均是void类型指针,但要用到开辟的动态存储区存储数据时要用到返回的void指针,但不能直接使用,应为void类型指针它不可以指向任何其他类型数据,因此需要将void类型指针类型转换为要存储数据的类型。
不过计算机会自动类型转换,所以可以不关心。
8.多重指针
- 指向指针数据的指针变量
定义:类型名 **变量名
此类的指针变量指向的数据类型是指针变量,即此类指针变量的值是另一个指针变量的地址。
四、指针变量作用
1.指针变量作函数参数
- 一般性
指针变量作函数参数与其他类型数据作参数一些方面一样,都是单行值传递,只返回至多一个变量。函数被调用运行期间形参存在,但调用结束后形参不存在,形参的值改变不会改变实参的值。 - 特殊性
指针变量作函数参数与其他类型数据作函数不同的地方是指针变量指向的是一个地址,被调用函数可以通过指针改变这个指针指向的变量的值,从而得到多个改变的值。
2.数组作为函数参数
-
无论是一维数组还是二维数组作为函数参数,计算机都会将它们转换为对应的指针变量来处理
如对于形参float array[],计算机会将它转换为float * array,该指针变量用来接收从实参数组传过来的地址 -
数组名其实是一个地址,它的值是该数组第一个元素的地址,用数组名做函数参数传递的一个地址
-
可以通过被调用函数改变数组元素的值,并且就算被调用函数结束数组元素改变依然存在,元素值改变就是原数组,没有临时生成一个形参数组
3.指针数组作为函数参数排序
可以通过交换指针数组元素的指向,最后依照数组元素顺序通过指针数组变量输出数据,来达到排序作用,同时并不改变被指向变量的值
总结
指针变量在一些方面很方便,它可以通过指针变量来引用其他类型变量。但同时它也会很危险,如定义一个指针变量没有给它赋值就直接使用它就很有可能破坏计算机中其他程序,再如当指针变量指向数组元素时进行向下或向上指向时注意指针变量是否超出数组范围。总之,要随时注意指针变量当前指向的变量是什么。