一、指针变量
当我们需要使用指针存储一个变量的时候,我们需要使用取地址操作符(&)来获取它的地址,用指针来存储它的地址
int a=10;
int* pa=&a;
此处,a是我们要存的变量,为整型变量,pa则是储存a的地址的变量,为指针变量。
二、使用const修饰指针
(一):const修饰常变量:
const int a=10;
此时,变量a不可以被直接修改,也就是
a=20;
是行不通的,(但我们仍可以通过pa储存a的地址,再解引用修改a的内容)。
(二)const修饰指针变量
我们根据const和*的关系分为两种情况:
m=100;
n=10;
int *const p = &n;
const int* p = &n;
对于第二行代码,我们是限制了变量p不可以被修改,也就是指针变量被限制了,但我们可以通过指针变量来修改指针指向的内容
可以*p=0;
不可以p=&m;
对于第三行代码,我们限制了指针指向的内容,也就是我们不能通过指针去修改指针指向的内容,但我们可以修改指针变量本身存的地址
可以p=&m;
不可以*p=0;
三、指针的运算
指针+/-整数
本质上是
地址+/-(变量类型的大小)*整数
也就是
int arr[5]={1,2,3,4,5};
int *p=arr;
*p==1;
*(p+1)==2;
四、野指针
①指针未初始化,导致指针指向一个随机内容
②指针越界访问
③指针指向的空间被释放(常见于存函数返回值的地址,可是返回值对应的数因为是局部变量,所以早就被释放了)
五、二级指针
指针变量寸一个特定类型的地址,而可不可以有一种变量存储指针变量的地址呢?
答:可以有,二级指针变量。
int a=10;
int *pa=&a;
int **ppa=&pa;
解引用的时候:
*ppa找到的是指针变量pa的地址,值为变量a的地址,**ppa找到的是a的地址,值为a中寸的值。
六、指针数组
形如
int *arr[10];
表示的就是指针数组,本质上是存有10个int*类型数据的数组。
七、字符指针变量
就是所指向内容是字符的指针,存的是字符的地址,
有一个巧妙的应用:
int main()
{
const char* pstr = "hello world";
printf("%s\n", pstr);
return 0;
}
此操作可以将字符串的首元素h存入pstr中,
打印出hello world是因为%s打印时会一直向后寻找'\0',恰好ptsr+2对应e,ptsr+3对应l......
八、数组指针变量
就是所指向内容是数组的指针,存的是数组首元素的地址,
形如
int arr[10]={0};
int (*p)[10]=&arr;
九、函数指针变量
就是指向函数的指针(函数名实际上就是函数的地址)