1.什么是指针
指针是变量对应的地址
如下当p存储了a的地址时可以说p指向a
也可以说p是a的指针
2.指针的声明
int a = 0;
int* p = &a;
如上用于储存地址的变量p被称为指针变量,
前面的int为指针类型(与地址对应数据保持一致)
* 该符号声明指针变量
3.如何通过指针访问地址对应的值
使用解引用符
int a = 0;
int* p = &a;
*p = 10;
此时a的值便更改为10;
4.野指针
野指针是随机的,不符合规范的指针
产生原因
1)未明确赋值地址
int*p;
*p = 20;
此时未将明确的地址赋值给指针
指针地址默认为随机
2)数组的越界访问
int arr[10] = {0};
int* p = arr;
int i;
for(i = 0;i <= 12;i++)
{
*(p++) = i;
}
当i = 10时数组便已经越界
此时指针p便是野指针,指向位置未知
3)指针指向的空间释放
多见于函数内部变量地址出函数即销毁
此时指向此地址的的指针便成为了野指针
#include<stdio.h>
int* test()
{
int a = 10;
return &a;
}
int main()
{
int* p = test();
*p = 10;
return 0;
}
5.野指针的避免
避免以上几条,且当指针所指向空间释放时给指针赋值为空(NULL)
使用前判断指针有效性
6.多级指针
指针变量也是变量,那么便会有与之相对应的地址
当此地址被另外的指针所指向的时候,该指针被称为二级指针
int a = 10;
int* p = &a;
int* *q = &p;
注意p的值和&p的值并不相同
7.指针数组和数组指针
指针数组是数组
数组指针是指针
指针数组即为存放指针的数组
int a = 10;
int b = 10;
int c = 10;
int* arr[3] = {&a,&b,&c};
数组指针是指向数组的指针(又称为行指针)
int a[4];
int (*p)[4] = &a;