1指针是什么
2一级指针
一级指针就是我们常说的指针变量,我们通常叫它指针,指针变量就是存放地址的变量,但是指针有属于自己的空间,所以指针会有自己的地址,只是他的空间里面放的是别人的地址。
如图:
(1)如何定义一个指针变量呢?
数据类型*变量名称。
数据类型是这个指针存的那个地址的数据类型。也就是指针指向的数据类型。
如果我们想要得到一个变量的地址的话,可以用取地址符号(&);来取得这个变量的地址。
int main()
{
int a=0;
int *p=&a;//这里指针存的是a的地址,a是一个整形所以这么写
return 0
}
此时我们想要打印a的话,我们可以直接访问a;也可以使用指针来间接访问a,间接访问需要用解引用符号(*),对指针进行解引用;如:
int main()
{
int a=0;
int *p=&a;
printf("%d",a);//直接访问
printf("%d",*p);//间接访问
return 0;
}
3野指针
在定义一个指针的时候我们同时就会对指针进行初始化,例如将某个变量的地址来将指针初始化,或者将指针置为空指针,代码如下:
int main()
{
int a=0;
int *p=NUll;//置为空指针。
int *e=&a;
return 0;
}
(1)野指针的成因
()(1)指针不初始化
如果我们不将指针初始化的话这是指针指向是随意的,就如你如果对一个整形的变量不初始化,这是整型变量的值是任意的整数,这就会导致野指针的出现。
int main()
{
int *p;//野指针
return 0;
}
()(2)指针越界访问
当你定义了一个数组,然后你用指针去访问了超过了这个数组长度的空间就会导致野指针。
如下:
#include <stdio.h>
int main()
{
int arr[10] = {0};
int *p = &arr[0];
int i = 0;
for(i=0; i<=11; i++)
{
//当指针指向的范围超出数组arr的范围时,p就是野指针
*(p++) = i;
}
return 0;
}
()(3)指向被释放的空间
当你的指针指向的那块空间已经被释放了就会导致指针成野指针;
如下:
#include <stdio.h>
int* test()
{
int n = 100;
return &n;
}
int main()
{
int*p = test();
printf("%d\n", *p);
return 0;
}
这看似test函数返回了一个n的地址,但是在执行完这个test函数之后n的所占用的空间就被释放了,因为n 的生命周期只在test函数开始到这个函数结束,这就导致p成了一个野指针。
(2) 如何避免野指针
()(1)初始化指针
()(2)小心指针越界
()(3)指针变量不再使⽤时,及时置NULL,指针使⽤之前检查有效性
int main()
{
int arr[10] = {1,2,3,4,5,67,7,8,9,10};
int *p = &arr[0];
for(i=0; i<10; i++)
{
*(p++) = i;
}
p = NULL;//此时p已经越界了,可以把p置为NULL
//下次使⽤的时候,判断p不为NULL的时候再使⽤
//...
p = &arr[0];//重新让p获得地址
if(p != NULL) //判断
{
printf("%d",*p);
}
return 0;
}
4二级指针
二级指针是指向一级指针的指针。
定义:
数据类型**变量名。
可以这么理解,靠近变量名的*,代表这个变量是指针,而数据类型*代表这个指针指向的是一个指针。
#include<stdio.h>
{
char *p=NULL;
char **p1=&p;//这里取出的是指针p的地址。
return 0;
}