指针有基本类型指针、函数指针、数组指针、指针数组(实质上是数组)、多级指针、空指针、野指针。
首先我们来讲讲基本类型指针
1.整形指针,字符指针,浮点指针等基本指针,这类指针储存对应类型的地址如
int a=5;
int *p=a;这个p便是储存着a的地址,同理,char*p则储存字符类型数组,那么这些指针有什么区别呢,首先,我们知道整形是4个字节,字符是1个字节,那么当对这类指针解引用想要取出里面的值时会访问相应字节内存。
后面就是函数指针,函数指针就指向某个函数,调用这个指针就可以调用相应函数,它的写法为函数返回类型+(*函数名)(函数传入值类型)比如我们可以写上加法函数
int add(int x,int y)
{
return x+y;
}
这个函数指针就是int (*ptr)(int x,int y)=add;可以通过函数ptr(3,5)来调用这个函数。那么我们可以借助函数指针进行很多灵活使用。可以优化性能,实现回调函数。
指针数组,毫无疑问就是储存指针的数组,定义为(类型)*(数组名)【数组元素个数】
里面储存的都是前面定义的类型指针的数组,如char*就全是字符指针类型的数组,他可以管理字符串等,如char*arr[3]={"hello","apple","world"}里面的arr[1]就是Apple的首字母地址。就可以依次打印出来。
数组指针,定义为指向数组的指针,写法是(类型)(*指针变量名字)【数组元素个数】
如我们写一个指向含有三个整形的数组的指针。
int arr[3]={0,1,2};
int(*ptr)[3]=&arr;那么ptr就是一个数组指针,它指向了arr数组,这个数组含有三个元素,是整形类型。通常用于函数传参时,能够接收一个固定类型的数组大小,防止数组长度丢失。
多级指针,我们以二级指针为例,二级指针就是储存了一级指针地址的指针,写法为(类型)**名字,如int*p=&a;int** pp=&p;那么pp就是二级指针变量储存了p指针的地址,同理,三级指针四级指针也是如此。
空指针就是可以用于初始化一个指针,它比较安全,不能对他进行操作,用于函数返回值。
野指针是一个未被初始化的指针,他很危险,因为他是指向随机内存的,调用的时候可能会导致程序出错或者不能达到预期。
指针与指针之间也有运算
指针-指针是两个指针之间的元素个数,当然要同类型的指针才能相减
指针+1就是跳过对应类型字节,int就是跳过四个,用在int类型数组就是指向下一个元素,用在char类型数组就是指向后面第四个的元素。
2037

被折叠的 条评论
为什么被折叠?



