指针的基本用法
指针?什么是指针?重根本上看,指针是一个值为内存地址的变量(或数据对象),例如
int类型变量的值是字符,而指针变量的值是地址。
声明指针:类型 + * +变量名(int * p)
int a = 0;
int * p = &a;p指向a的地址,指针变量p储存的是地址
用*p 取出存储的数据,也可以重新给*p重新赋值改变变量a的值
指针类型的意义:
不同类型指针存储的空间大小不同,char类型占1个字节,int类型占4个字节。地址向后+1跳过的长度不同,char类型跳过1个字节,int类型跳过4个字节
三·void*指针(空指针)
void指针可以接收所有类型指针的地址,但不能进行解引用操作(只能接收,不能发出)
四·const修饰指针变量()
const修饰指针有两种格式:
1·在*前 int const * p(const在前指针p可以改变存储地址,但不能对解引用操作赋值)
2·在*后 int * const p(const在后p不能改变存储地址,但可以进行解引用操作)
五·指针- 指针(只能在同一数组里进行)
指针 + 整数 = 指针 指针 - 指针 = 整数(往后跳了n*(p+1)个)
六·求字符串长度
字符串的最后一个元素是结束符号\0,而arr传入的是起始地址,那么我们可以写一个循环,若解引用不是结束符号\0,这地址跳到下一个位置直到跳到结束符终止,代码如下
七.野指针
概念:野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)
出现的原因
1.指针未初始化
例如
int main()
{
int* p;
*p = 20;
printf("%d", *p);
return 0;
}//便会报错
2.指针越界访问
代码如下
可以看到我们最后多打印了一个随机值理由如下
指针越界访问了,超过了数组的范围,所以打印了随机值
3.指针指向释放了的空间
例如
#include<stdio.h>
int * text()
{
int a = 6;
return &a;
}
int main()
{
int* p = text();
printf("%d",*p);
return 0;
}
创建了一个局部变量a,当a出了text函数时变量已经销毁,再次访问时就是非法访问了
如何避免野指针呢
1.一定要初始化指针变量
2.当变量不用时及时置空,置空用NULL;例如int * a = NULL;(NULL 是C语⾔中定义的⼀个标识符常量,值是0,0也是地址,这个地址是⽆法使⽤的,读写该地址 会报错)
3.避免返回局部变量的地址
4.小心指针越界访问