前言:指针复杂类型说明
int p; //这是一个普通的整型变量
int *p; //首先从P 处开始,先与*结合,所以说明P 是一个指针,然后再与int 结合,说明指针所指向的内容的类型为int 型.所以P是一个返回整型数据的指针
int p[3]; //首先从P 处开始,先与[]结合,说明P 是一个数组,然后与int 结合,说明数组里的元素是整型的,所以P 是一个由整型数据组成的数组
int *p[3]; //首先从P 处开始,先与[]结合,因为其优先级比*高,所以P 是一个数组,然后再与*结合,说明数组里的元素是指针类型,然后再与int 结合,说明指针所指向的内容的类型是整型的,所以P 是一个由返回整型数据的指针所组成的数组
int (*p)[3]; //首先从P 处开始,先与*结合,说明P 是一个指针然后再与[]结合(与"()"这步可以忽略,只是为了改变优先级),说明指针所指向的内容是一个数组,然后再与int 结合,说明数组里的元素是整型的.所以P 是一个指向由整型数据组成的数组的指针
int **p; //首先从P 开始,先与*结合,说是P 是一个指针,然后再与*结合,说明指针所指向的元素是指针,然后再与int 结合,说明该指针所指向的元素是整型数据.由于二级指针以及更高级的指针极少用在复杂的类型中,所以后面更复杂的类型我们就不考虑多级指针了,最多只考虑一级指针
下面来介绍指针的使用。
1.指针变量的定义和指针变量的基类型
- 定义指针的一般形式如下:
类型名 *指针变量名1,*指针变量名2,……..;
例如:int *pi,*pj;
在每变量前的星号*是一个说明符,用来说明该变量是指针变量。注意:变量前的星号说明符不可省略,省略了就变成了定义整型变量。
- 基类型
int *p;
int 是类型名,说明了pi和pj是两个指向整形(int类型)变量的指针,也就是说变量pi和pj中只能存放int类型变量的地址,这时我们就称int是指针变量pi和pj的基类型。又如:
double *pd; char *s1,*s2;
其中pd是的基类型为double类型,在指针变量pd中,只能存放double类型变量的地址;s1和s2的基类型为char类型,在s1和s2中只能存放char类型变量的地址。
- 指向指针的指针
定义p1为一个指向指针的指针变量。
int **p1;
int *p2,int i=3;
p2=&i; p1=&p2;
p2=&i用来求出整形变量i的地址赋给指针变量p2,而使p2指向i;p1=&p2用来求出指针变量p2的地址赋给指针变量p1,它使p1指 向p2。
2.指针变量的初始化
- 通过&获得地址值
int i;
int*p=&i;变量必须与已定义类型一致
注:int i;
static int *p; 错误 不能用auto变量的地址去初始化static整形指针。
- 通过指针变量获得地址值
int i;
int *p=&i;
int *q=p;用已初始化的指针变量作初值,p和q指向同一地址。
注:int a,b,*p1,*p2;
*p1=10;*p2=20; 错误 指针变量储存确定的地址值才能使用,否则会造成系统崩溃
- 通过标准函数获得地址值
int *pi;
pi=(int *)malloc(4); malloc返回void*
- 给指针变量赋“空”值
int *p;
p=NULL; //NULL的代码值为0,当执行了以上的赋值语句后,称p为空指针
指针p并不是指向地址为0的储存单元,而是具有一个确定的值的----“空”,企图通过一个空指针去访问一个存储单元时,将会得到一个出错信息。
3.指针运算
- 算术运算
当指针指向一串连续的存储单元时,
可以对指针变量进行加减一个整数的运算。
也可以对指向同一串连续的存储单元的两个指针相加减运算。如:
p2-p1=3; *(p2)-(*p1)=33;
注:对指针加减运算时,数字“1”不再代表十进制的整数“1”,而是指1个存储单元长度
- 关系运算
若p1和p2指向同一数组,则
p1<p2,表示p1指向的元素在前
p2>p2,表示p1指向的元素在后
4.指针变量的引用
- 两种基本的运算符
&:取地址运算符(只能应用于变量和数组元素,不能用于表达式,常量和register变量)
*:指针运算符(”间接访问运算符”,只能应用于指针变量或者地址 *(&a))
i_pointer----------指针变量,它的内容是地址量2000
*i_pointer---------指针的目标变量,它的内容是数据10
&i_pointer--------指针变量占用内存的地址是2004
5.形参做指针变量
- 特点
共享内存,”双向传递”
实参必须是基类型相同的地址值或者已指向某个存储单元的指针变量。
#include <stdio.h>
void swap(int *p1,int *p2)
void main(){
int a,b;
int *pointer_1,*pointer_2;
scanf("%d,%d",&a,&b);
pointer_1=&a;pointer_2=&b;
if(a<b)
swap(pointer_1,pointer_2);//地址传递
printf("\n%d,%d\n",a,b);
}
void swap(int *p1,int *p2){ //函数调用结束后,分配给p1,p2单元释放
int temp;
temp=*p1;*p1=*p1;*p2=temp;
}