1.指针的概念:
指针是什么,指针就是一个值为内存地址的变量(或者数据对象)。
1.1. 变量和地址
void main()
{
int x=10,y=20;
}
这就是一个赋值的过程,假设有两个地址2000H,2001H,其中x进入2000H,而y进入2001H,这样2000H,2001H就是两个变量的地址。
1.2. 指针变量和指针的类型
指针变量就是一个指针,它存储的内容就是一个指针。
指针的类型就是确定这个指针是那种类型,例如char,int,float,
2.变量的指针和指针变量
变量的指针就是变量的存储地址,而指针的变量就是储存指针的变量。
2.1、指针变量的定义及使用
(1)指针变量的定义
指针变量的定义形式如:数据类型 *指针名;例如:
//分别定义了 int、float、char 类型的指针变量
int *x;
float *f;
char *ch;
如上面的定义,指针变量名为 x、f、ch。
(2)指针变量的使用
取地址运算符&:单目运算符&是用来取操作对象的地址。例:&i 为取变量 i 的地址。对于常量表达式、寄存器变量不能取地址(因为它们存储在存储器中,没有地址)。
指针运算符*(间接寻址符):与&为逆运算,作用是通过操作对象的地址,获取存储的内容。例:x = &i,x 为 i 的地址,*x 则为通过 i 的地址,获取 i 的内容。
代码示例:
//声明了一个普通变量 a
int a;
//声明一个指针变量,指向变量 a 的地址
int *pa;
//通过取地址符&,获取 a 的地址,赋值给指针变量
pa = &a;
//通过间接寻址符,获取指针指向的内容
printf("%d", *pa);
2.2指针变量的初始化
指针变量在定义时可以赋值,即初始化。可以赋值“NULL”或“0”。此时赋值的0不是数字,而是NULL的字符值。
int x;
int *px=&x;//在定义指针变量px的时候,就赋值给px;
int *p1=NULL, *p2=0;//定义指针变量,分别赋值“NULL”和“0”
2.3.指针加减运算
1.用于数组中最为常见的就是指针变量的自增自减运算。
指针加1和减1,就是指针向前移动或向后移动一个单元长度。
2.指针变量加上或减去一个整形数。和第一条类似,具体加几就是向前移动几个单元,减几就是向后移动几个单元。
//定义三个变量,假设它们地址为连续的,分别为 2000、2004、008
//整型的int 每个变量占四个字符节
int x, y, z;
//定义一个指针,指向 x
int *px = &x;
//利用指针变量 px 加减整数,分别输出 x、y、z
printf("x = %d", *px); //因为 px 指向 x,所以*px = x
//这里要先(px + 1),再*(px + 1)获取内容,因为单目运算符“*”优先级高于双目运算符“+”
printf("y = %d", *(px + 1));//px + 1,表示,向前移动一个单元(从 2000 到 2004)
printf("z = %d", *(px + 2));//px + 2,表示,向前移动一个单元(从 2004 到 2008)
2.4.关系运算
假设有指针变量 px、py。
px > py 表示 px 指向的存储地址是否大于 py 指向的地址
px == py 表示 px 和 py 是否指向同一个存储单元
px == 0 和 px != 0 表示 px 是否为空指针
//定义一个数组,数组中相邻元素地址间隔一个单元
int num[2] = {1, 3};
//将数组中第一个元素地址和第二个元素的地址赋值给 px、py
int *px = &num[0], *py = &num[1];
int *pz = &num[0];
int *pn;
//则 py > px
if(py > px){
printf("py 指向的存储地址大于 px 所指向的存储地址");
}
//pz 和 px 都指向 num[0]
if(pz == px){
printf("px 和 pz 指向同一个地址");
}
//pn 没有初始化
if(pn == NULL || pn == 0){
printf("pn 是一个空指针");
}