第八章:指针
指针重要性:
- 数据库–>动态分配内存
- 数据结构–>链表、队列、树、图等
- 操作系统–>改善子程序的效率
- 指针为函数提供修改变量值的手段
8.1-地址和指针
变量的地址
-
计算机中,数据存储在内存中
-
内存:是内部存储器,由存储单元组成的。内存可划分为若干存储单元,每个单元存放8位二进制数,即一个字节,其中存放的数据称为内存单元的内容。
-
内存单元采用线性地址编码,每个单元具有唯一一个地址编码。地址编码是无符号整数型,通常用十六进制数表示。地址一旦编号后固定不变,但存储内容是动态的,经常变化。
-
C编译系统对程序中定义的变量,会根据变量的数据类型为其分配一定字节数并且连续的存储空间。分配的存储单元大小以及存储的数据格式由该变量的数据类型决定。
-
C和C++决定:存储某变量内存空间的首地址称为该变量的地址
short a=3;
char b='A';
float c=2.5;系统为变量a分配了1000和1001这两个内存单元,1000是变量a的地址。变量b分配1002这个内存单元,1002是变量b的地址。变量c分配了1003、1004、1005和1006这4个内存单元,1003是变量c的地址。如果要输出变量a的值,则先要找到a在内存中的地址
访问方式
直接访问方式
- 直接根据变量名存取变量的值
chort a=3;
char b='A';
float c=2.5;
间接访问方式
- 定义指针变量,将变量的地址存放在此变量中,当要对变量进行存取时先读取该变量的值,得到要存取变量的地址,再对该变量进行访问
- 易混淆概念
变量i:变量的值和变量的地址(指针)
指针:地址
指针变量:存放地址的变量
8.2-指针变量
指针变量的概念
- 专门用来存放内存单元地址的特殊变量:指针变量
- 指针变量中存放的是另一个有值变量的地址
- 变量的指针就是变量的地址。一个指针变量一旦存放了某个变量的地址,该指针变量就指向了这个变量。
int *pointer_1,*pointer_2; //定义指向整型数据的指针变量pointer_1, pointer_2pointer_1=&a; //把变量a的地址赋给指针变量pointer_1
pointer_2=&b; //把变量b的地址赋给指针变量pointer_2 printf("a=%d,b=%d\n",a,b); //输出变量a和b的值
printf("*pointer_1=%d,*pointer_2=%d\n",*pointer_1,*pointer_2);//用指针变量输出变量a和b的值
指针变量的定义
-
一般形式
数据类型 *指针变量名[=初始地址值];数据类型是指向的变量的数据类型 *表示其后面的变量是指针变量eg: int *p1,*p2; char *p3;
-
注意:指针变量只能存放与它数据类型相同的变量的地址
int *pointer_1;
指针变量名是pointer_1,而不是*pointer_1
指针变量的赋值
- 用变量的地址给指针变量赋值(求地址运算符&)
int a,b,*p;
p=&a;
- 用相同类型的指针变量赋值
int a,*p1,*p2;
p1=&a;
p2=p1
- 赋空值NULL(0)
float *p;
p=NULL
p=0;
- 说明
NULL是一个空指针,空值指针NULL是一个不指向任何存储单元的指针,表示该指针变量的值没有意义。作用是为了避免对没有被初始化的指针变量的非法引用。
指针变量的初始化
- 赋空值NULL
- 用已定义的变量的地址
1.int *p1=NULL;
2.float a,*pf=&a;
指针运算与指针变量的应用
- 基本运算
- 算数运算
- 关系运算
- 赋值运算
指针基本运算规则
- &、*优先级别相同(2级),但为右结合性(单目运算符)
- &、*使用说明:
int a=5,*p=&a;则&*p含义:&*p-->&a,即p
则*&a含义:*&a-->*p,即a
则(*p)++含义:(*p)++ -->a++
*p++相当于*(p++),先得p所指向得变量的值,然后p+1,p不再指向a
指针的算术运算:指针增量的概念
- 指针增量:指针变量是做++、–、+、-等运算,指针增量的运算不是单纯的算术运算,而是地址按数据个数增加所指的目标变量字节数
float a[10]={0,1,2,3,4,5,6,7,8,9};
float *p=a;此时p指向数组a的首地址,p++或p+1是p原有的值加上4个字节,若p原有地址值为2000,则p++或p+1的地址值是2004即向后移动指针变量,使其指向后一个同类型变量
-
C语言地址运算规则规定:
- 指针加减一个整数n,计算结果仍然是一个地址量,它是以运算符的地址量为基点,前方或后方第n个数据的地址