目录
一、不同类型的指针
二、数组指针的使用——二维数组传参
三、二级指针传参
四、函数指针
五、指针与数组易错题讲解sizeof() strlen()
一、指针分类
指针类型的意义:指针类型决定了该指针在解引用操作后所能访问空间的大小(字节),也决定了指针的步长。
//char * 字符指针
char m='w';
char*p=&m
//int* 整型指针
int m=2;
int*p=&m;
数组指针——存放数组的地址
int arr[10];
int (*p)[10]=&arr;
其中 int (*)[10]为数组指针类型
函数指针——存放函数的地址
函数地址:&函数名==函数名
函数指针:返回类型+(*变量名)+(参数类型)
int Add(int x,int y){
.....
}
int (*p)(int,int)=&Add;//存放
(*p)(2,3); //调用
二级指针——存放一级指针的地址
int m=2;
int*p=&m;
int**p=&p
二、二维数组传参
二维数组:arr[3][4] 可以想象成3个元素的数组,每个元素是由4个元素组成的数组
二维数组传参:
数组名==数组首元素地址
arr==二维数组首元素地址 二维数组首元素==arr[0]
而arr[0]是一个4个元素大小的数组,数组的地址用数组指针表示 故使用int (*p)[4]作为接收函数的形参
三、二级指针传参
思考:
void test(int **p)
对应的函数test()可以传什么样的参数呢?
函数的形参为二级指针,故它可以传满足一下条件之一的参数:
(1)int **ptr
test(ptr) //二级指针
(2) int *ptr
test(&ptr) //一级指针的地址
(3) int*arr[10]
test(arr) //指针数组的数组名==指针数组的首元素地址==(int*)类型元素的地址==int**
四、函数指针
函数的地址:&函数名 或 函数名
函数指针构成: 返回类型(*变量名)(参数类型)
int Add(int x, int y)
{
return x+y;
}
函数指针设置
int (*p)(int,int)=&Add
int (*p)(int,int)=Add
调用
int sum=(*p)(2,3)
int sum=p(2,3)
函数指针数组:
int (*pArr[2])(int,int)={Add,Sub}
pArr 先和 [] 结合,说明 pArr是数组,数组的内容是int (*)(int,int)类型的函数指针
存放返回类型和参数类型一致的函数地址
pArr[0](2,3)=5 执行Add(2,3)
pArr[1](2,3)=-1 Sub(2,3)
五、易错题
sizeof()是操作符,返回一个变量或者类型的大小(以字节为单位)。
strlen()是库函数,从内存的某个位置(可以是字符串开头,中间某个位置,甚至是某个不确定的内存区域)开始扫描,直到碰到第一个字符串结束符'\0'为止,然后返回计数器值(长度不包含'\0')。