一、定义:
存储类型 数据类型 *指针变量名
存储类型:auto(默认),register,static,extern
数据类型:由基本数据类型(int,char,short,long,float,double)+ *构成,代表指针所指向 的数据的数据类型 eg:int *p表示p指针指向的是一个int型的数据。
指针变量名:标识符(由字母,数字,下划线组成,不能以数字开头,不能与关键字重名)
指针变量:是一个变量,存放的是一个地址常量。
二、初始化:
(1)指向整型:int a=0;int *p=&a(&表示取地址),把a的地址赋值给p
(2)指向字符型:char a='s'; int *p=&a
(3)指向数组:int a[3]={1,2,3}; int *p=a;a是数组名,本身就是地址常量,其值为数组首地址的值,代表的是整片数组空间,不需要用&对其取地址。int *p=&a[0],a[0]代表数组的第一个元素,所以需要用&对其进行取地址。
三、赋值:
(1)int a=0; int *p=NULL; p=&a;
(2)char a='s'; int *p=NULL;p=&a;
(3)int a[3]={1,2,3}; int *p=NULL; p=a; p=&a[0]
注意:在定义指针变量时,如果不知道其接下来需要指向哪儿,不想对其进行初始化时,请初始化为NULL,NULL地址空间不允许被用户访问,可以避免后续指针变量指向不明所带来的段错误。
四:指针的运算:(通过间接访问的方式操作变量的值)
int a=0;
int *p=&a;
*p=2; (*表示取值,p此时指向a的地址,*p就代表a的值,将2赋值给*p等于将2赋值给a)
五:指针变量的运算:(对地址进行偏移,改变指针的指向)
p++; //指针向高地址偏移一个数据类型单位 p = p +1*(数据类型单位)
p--; //指针向低地址偏移一个数据类型单位
p+N; //指针向高地址偏移N个数据类型单位 p + N * (数据类型单位)
p-N; //指针向低地址偏移N个数据类型单位
p + q //指针没有加法运算,两个地址相加没有实际意义
p - q //两个地址之间相差多少个字节,可通过(p-q)/(数据类型单位)计算两个地址之间存储了多少个元素,计算长度。
六:const修饰指针:
(1)int const *p; //不能通过p修改p所指向的变量的值
= const int *p;(2)int * const p; //不能改变p的指向。
(3)const int *const p; //既不能改变p的指向,也不能通过p修改p所指向的变量的值
= int const * const p;总结:当const在*前面时,不能通过指针修改值(即不能对*p进行赋值)
当const在*后面时,不能修改指针的指向(即不能对p进行赋值)
当*前后都有const时,既不能修改指针的指向,也不能通过指针修改值(即不能对*p和p进行赋值)
七:二级指针(指向指针地址的指针)
<存储类型> <数据类型> **变量名;
int a = 10
int *p = &a;
int **q; //
q = &p; //q指向p指针的地址
**q 为10; //**q表示对*p指针指向的地址取值,即取a的值,所以为10