1.指针是什么
编程语言中的对象,指向电脑存储器中另一个地方的值,也可以理解为内存单元的编号(地址)
2.指针类型的意义
- 指针类型决定了访问权限的大小
- 指针类型决定了指针走一步的步长
3. 野指针
3.1 概念
指向的位置随机,不可知(非法访问内存)
3.2 成因
- 指针未初始化
int main()
{
int* p; // p是一个局部指针变量,局部变量不初始化默认是随机值
*p = 20; //非法访问内存 --程序无法运行
return 0;
}
- 指针越界访问
int main()
{
int arr[10] = { 0 };
int* p = arr;
int i = 0
for (i = 0; i <= 10; i++)
{
*p = i;
p++ //循环了11次,但i的长度仅为10,第是一次访问属于越界访问
}
return 0;
}
- 指针指向的空间释放
int* test()
{
int a = 10;
return &a;
}
int main()
{
int* p = test();
*p = 20; //当函数结束后,内部的值已经被释放,所以属于非法访问
return 0;
}
3.3如何避免野指针
- 指针初始化(两种方式)
int* p = NULL; -->需要 <stdio.h> int* pa = &a;
- 小心指针越界 --> c语言本身不检查数据越界行为
- 空间被释放时放置NULL
- 指针使用前要检查有效性
int main()
{
int* p = NULL;
if(p!= NULL)
*p = 10;
return 0;
}
4. 指针的运算
4.1 指针加减整数
4.2 指针-指针整数
指针-指针得到两个指针间的元素个数
注意:两个指针的类型要相同(要指向同一块空间)
int my_strlen(char* s)
{
char* start = s;
while (*s != '\0')
{
s++;
}
return s - start;
}
int main()
{
int len = my_strlen("abc");
printf("%d\n", len);
return 0;
}
5. 二级指针?
指针地址的地址
int main()
{
int a = 10;
int* pa = &a;
int** ppa = &pa;
printf("%d\n", ppa);
return 0;
}
6.指针数组
整型数组 --> 存放整形的数组 指针数组 --> 存放指针的数组
int* parr[5];