指针是什么?
在计算机科学中,指针是编程语言中的一个对象,利用地址,它的值直接指向存在电脑存储器中另一个地方的值。由于通过地址能够找到所需的变量单元,可以说,地址指向该变量单元。因此,将地址形象化的称为指针。意思是通过它能找到以他为地址的内存单元。
总之,指针就是变量,用来存放地址的变量
#include<stdio.h>
int main()
{
int a = 10;
int* p = &a;//p就是指针变量,类型是int*
}
指针类型
指针类型决定了指针进行解引用的时候,能访问空间的大小
int*p; 能访问4个字节
char*p 能访问1个字节
double*p 能访问8个字节
指针类型也决定了指针走一步走多远(指针的步长)
int*p;p+1走4个字节
char*p;p+1走1个字节
double*p;p+1走8个字节
野指针
概念:野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)
为什么会产生野指针?
1、指针未初始化
#include<stdio.h>
int main()
{
int a;//局部变量不初始化,默认是随机值
int* p;//局部的指针变量,就被初始化随机值
*p = 20;
}
2、指针越界访问
#include<stdio.h>
int main()
{
int arr[10] = { 0 };
int* p = arr;//数组名是首元素的地址
int i = 0;
for (i = 0; i <= 11; i++)
{
*(p++) = i;//当指针指向的范围超出数组arr范围时,p就是野指针
}
}
如何避免野指针
1、指针初始化
2、小心指针越界
3、指针指向空间释放即使置NULL
4、指针使用之前检查有效性
指针运算
1.加减整数
#include<stdio.h>
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int i = 0;
int sz = sizeof(arr) / sizeof(arr[0]);
int* p = arr;
for (i = 0; i < sz; i++)
{
printf("%d ", *p);
p++;
}
}