指针的定义:
[存储类型] [数据类型] *指针变量名;
指针初始化的两种方式:
1.在声明指针变量的同时为指针变量赋值
int a=10; int *ptr=&a;
2.
int a=10; int *ptr=NULL; ptr=&a;
*:可以取出指针指向的地址的值。
int a=10; int *p=&a; int b=*p; //b的值为10
指向指针的指针(二级指针)
定义格式:
数据类型 **指针变量名;
int **p; //定义了一个二级指针,指针指向的地址的值是另一个指针的地址 int a=10; int *q=&a; p=&q;
指向数组的指针(数组指针)
定义格式:
数据类型 (*指针变量名)[数组元素个数n];
int (*p)[3]; //定义了一个指向有三个int型元素的数组的指针 //用法: int a[2][3]; p=a; int c=p[1][2]; p=p+1; //p指向第二行首地址
指向函数的指针(函数指针)
定义格式:
数据类型 (*指针变量名)(参数列表);
int (*fun)(int a,int b);
定义了一个指向函数的指针,这个函数的返回值为int类型,有两个int类型的参数
//用法:
int add(int a,int b)
{
return a+b;
}
fun=add;
int result=fun(2,3);
指针数组
定义格式:
数据类型 *指针变量名[元素个数n];
int *p[3]; //定义了一个数组,数组的元素是指向int类型的指针。 //用法: int a,b,c; p[0]=&a[0]; p[1]=&a[1]; p[2]=&a[2];指针的算术运算
指针的算术运算有:
int arr[10]; int *p=&a[5]; +:p=p+n; //指针向地址大的方向移动4*n个字节,4=sizeof(int) -:p=p-n; //指针向地址小的方向移动4*n个字节 ++:p++; //指针向地址大的方向移动4个字节 --:p--; //指针向地址小的方向移动4个字节
两个指针相减:
int *q=&a[8]; int n=q-p; //n为两个指针指向的地址相隔的数据的个数。
*的优先级和++、--的优先级相同,都高于+、-,当*和++同时出现时,按照自右向左的顺序进行计算,例如:*p++,相当于*(p++),*p+1相当于(*p)+1。
指针的关系运算指针可以进行的关系运算有:> < >= <= == !=
指向地址大的指针大于指向地址小的指针,如:
int a[10];
int *p=&a[1];
int *q=&a[2];
则:q>p;
指针与数组 指针指向一维数组int a[10]={1,2,3,4,5,6,7,8,9,10};
int *p=a;
数组名a与a[0]的地址相同,代表数组的首地址,a+1表示向地址大的方向移动4个字节。
&a的值与a[0]的地址相同,代表数组整体的首地址,&a+表示向地址大的方向移动4*10个字节。
访问数组元素a[1]的方式有:
a[1]、*(p+1)、*(a+1)
获得数组元素a[1]的地址的方式有:
&a[1]、a+1、p+1
指针指向二维数组int a[3][4]={
{1,2,3,4},
{5,6,7,8},
{9,10,11,12}
};
int (*p)[4]=a;
&a+1:移动48个字节;a+1 :移动一行
a[0]+1、&a[0][0]+1:移动4个字节
访问数组元素a[2][3]的方式有:
a[2][3]、*(*(a+2)+3)、p[2][3]、*(*(p+2)+3)



