目录
基础概念:
指针是内存中一个最小单元的编号,也就是地址
平时口语中说的指针,通常指的是指针变量,是用来存放内存地址的变量
指针是用来存放地址的,地址是唯一标示一块地址空间的。
指针的大小在32位平台是4个字节,在64位平台是8个字节。
定义:
char *pc = NULL;
int *pi = NULL;
short *ps = NULL;
long *pl = NULL;
float *pf = NULL;
double *pd = NULL;
每个类型的指针指向他们相对应的类型,而指针的大小并不因其类型而有所不同,都是4个字节。
int num = 10;
p = #
*p = 20;
我们通过上述代码,把定义一个类型为int的指针p,其指向num所占用的空间,而*p就是把p解引
用,便可以访问到num,因此num现在变成了20.
指针加减整数:
int main()
{
int n = 10;
char *pc = (char*)&n;
int *pi = &n;
printf("%p\n", &n);
printf("%p\n", pc);
printf("%p\n", pc+1);
printf("%p\n", pi);
printf("%p\n", pi+1);
return 0;
}
通过上述代码,我们发现各个不同类型的指针加减相同的整数后的地址变化是不同的,其加减后与原先的差值便是这个类型所占用的内存空间大小。
指针的解引用:
#include <stdio.h>
int main() {
int n = 0x11223344;
char *pc = (char *)&n;
int *pi = &n;
*pc = 0;
*pi = 0;
return 0;
}
通过上述代码,我们把int*类型的指针强制转化成char*类型的指针,在调试过程中,本来应该把int所指向的4个字节都变成0,但是由于这是char*类型,因此只把4个中的一个变成了0。
野指针:
野指针就是不符合要求的指针,其出现主要原因如下:
指针未初始化
#include <stdio.h>
int main() {
int *p;
*p = 20;
return 0;
}
指针越界访问
#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;
}
这一点和数组越界访问是一样的,访问没有权限的地方,这里是随机值,任何情况都有可能发生,因此要规避这种情况发生。
指针指向的空间释放
这个一般会发生在动态开辟内存时空间释放时,在后续章节会提到,这里稍做了解即可。
避免野指针的方法:
指针初始化
小心指针越界
指针指向空间释放即使置NULL
避免返回局部变量的地址
指针使用之前检查有效性
二级指针:
由于指针也是一个变量,它也有属于自己的空间,所以我们可以再创建一个指针来指向这个指针的空间,就和套娃一样,理论上可以创建无数个多级指针。定义如下:
int a = 0;
int* pa = &a;
int** ppa = &pa;
那么二级指针如果解引用一次就访问的是一级指针pa,如果解引用两次就访问了变量a。
指针数组:
和整形数组,浮点数数组一样,指针数组不是指针,而是数组,是一组存放指针的数组。
int* arr3[5];
定义如上,我们可以拿它存储pa,pb,pc等指针,但是这种方法一般不常用。