1.指针是什么

编程语言中的对象,指向电脑存储器中另一个地方的值,也可以理解为内存单元的编号(地址)

2.指针类型的意义

  1. 指针类型决定了访问权限的大小
  2. 指针类型决定了指针走一步的步长

3. 野指针

3.1 概念

指向的位置随机,不可知(非法访问内存)

3.2 成因

  1. 指针未初始化
int main()
{
	int* p; // p是一个局部指针变量,局部变量不初始化默认是随机值
	*p = 20; //非法访问内存 --程序无法运行
	return 0;
}
  1. 指针越界访问
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;
}
  1. 指针指向的空间释放
int* test()
{
	int a = 10;
	return &a;
}
int main()
{
	int* p = test();
	*p = 20; //当函数结束后,内部的值已经被释放,所以属于非法访问
	return 0;
}

3.3如何避免野指针

  1. 指针初始化(两种方式)

int* p = NULL; -->需要 <stdio.h> int* pa = &a;

  1. 小心指针越界 --> c语言本身不检查数据越界行为
  2. 空间被释放时放置NULL
  3. 指针使用前要检查有效性
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];