指针是什么?
我们可以这样理解
编号——地址——指针 地址存起来需要变量,所以存放地址的变量又被称为指针变量
int main()
{
int a = 10;//在内存中开辟一块空间,a占4个字节
int * pa = &a;//对变量a取出它的地址,拿到的是a的4个字节中第一个字节的地址
//将a的地址放入pa变量中,*说明pa是指针变量
*pa = 20;
return 0;
}
总结:(1)内存被划分成了一个个小单元,一个单元一个字节;
(2)对每个小单元进行编号(3)要把编号存起来,所以引出指针变量存放地址
(4)指针的大小在32位平台的大小是4个字节,在64位平台的大小是8个字节。
指针和指针类型
指针的大小相同,那么说明指针类型是没有意义的,这么说是不是可以创建一个通用类型的指针呢?但现实确是不行的,所以也可以说明指针类型是又意义的
指针类型的意义是什么?
1、指针类型决定了:指针解引用的权限有多大(能操作几个字节);
int能访问4个字节
char能访问1个字节
2、指针类型决定了:指针走一步,能走多远(步长)
字符指针+1相当于跳过了1个字符,所以+1;整型指针+1相当于跳过了一个整型,所以+4.
p+1加几取决于p的类型,与p指向的对象和赋的值没有关系
3、 野指针
概念:野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)
野指针的成因
(1)指针位初始化
#include <stdio.h>
int main()
{
int *p;//局部变量指针未初始化,默认为随机值
*p = 20;//非法访问内存
return 0;
}
2、指针越界访问
int main()
{
int arr[10] = { 0 };
int* p =arr;
int i = 0;
for(i=0;i<=10;i++)
{
*p = i;
p++;
}
return 0;
}
3、指针空间的释放
int * test()
{
int a = 10;
return &a;//a出来后结束了生命周期,所以就销毁了
}
int main()
{
int *p = test();
*p = 20;
return 0;
}
详见动态内存
如何规避野指针
(1)指针初始化
*当不知道p应该初始化为什么地址时,直接初始化为NULL
int* p = NULL;
*明确知道初始值
int a = 10;
int* ptr = &a;
(2)小心指针越界——c语言本身不会检查数据的越界行为
(3)指针指向空间施放及时置NULL
(4)指针使用之前检查有效性
int* p = NULL;
if(p !=NULL)
*p = 10;