指针和指针类型
char* 类型的指针是为了存放 char 类型变量的地址。
short* 类型的指针是为了存放 short 类型变量的地址。
int* 类型的指针是为了存放 int 类型变量的地址。
以此类推
- 指针是用来存放地址的
- 在32位平台下是4个字节,64位平台下是8个字节
野指针
造成野指针的几个原因
- 指针未进行初始化
- 指针越界访问
例如以下代码
#include <stdio.h>
int main()
{
int arr[10] = {
0};
int *p = arr;
int i = 0;
for(i=0; i<=11; i++)
{
*(p++) = i;
}
return 0;
}
当指针指向的范围超出数组arr的范围时,P就是野指针了
- 指针指向的空间释放
指针运算
- 指针±整数
例如指针p一来指向数组arr的首元素地址,此时p++后,p就指向了arr的第二个元素地址(即arr[1])。 - 指针-指针
只有当两个指针都指向同一个数组中的元素时,才允许从一个指针减去连一个指针。两个指针相减的结果是一种有符号的整形数据,值是两个指针在内存中的距离。 例如以下情况
#include <stdio.h>
int main()
{
int arr[10] = {
0};
int *p = &arr[1];
int *q = &arr[9];
printf("%d\n",p-q);//-8
printf("%d\n",q-p);//8
//相减后相差8个元素,也就是相差了32个字节,相差的字节数再除以类型所占字节数就是得出的结果
printf("%d\n",(short *)q-(short *)p);//16 因为short类型只占2个字节
printf("%d\n",(char *)q-(char *)p);//32 32/1=32
printf("%d\n",(double *)q-(double *)p);//4 32/8=4
printf("%d\n",(long *)q-(long *)p);//8 32/8=4
//printf("%d\n",(int *)q-(short *)p);//error
return 0;
}
注意:不同类型的指针不能够相减。
二级指针
指针变量也是变量,那么变量也是需要地址来存放,所以二级指针就是用来存放指针的。
int a=10;