指针初阶2

指针

  • 野指针
    • 指针未初始化
    • 指针越界
    • 指针指向的空间释放
  • 如何避免野指针出现
    • 指针要初始化
    • 小心指针越界
    • 指针指向空间释放及时置null
    • 指针使用前有效检查
  • 指针的运算
    • 指针+-整数![在这里插入图片描述](https://img-blog.csdnimg.cn/2a8a67d8d24045db8c43aec43917f998.png)
    • 指针-指针

野指针

指针初阶2_第1张图片

指针未初始化

int main()
{    //这里的p就是野指针
	int* p;//p是一个局部指针变量,局部变量不初始化的话,默认是随机值
	*p = 20;//非法访问内存了


	return 0;
}

指针越界

int mian()
{
	int arr[10] = { 0 };
	int* p = arr;
	int i = 0;
	for (i = 0; i <= 10; i++)//越界访问只有10个数组  <=10访问了11个
	{

		*p = i;
		p++;
	}


	return 0;
}

指针指向的空间释放

举个简单的例子,你租了一套房在你租房期间你可以随意进入,但当你房子到期你把房子交给房东之后你若再次闯入就是非法闯入了

通俗举例

a生命周期只在函数内。test调用结束就被释放了。静态生成的内存 函数结束会释放 动态就没事了

int* test()
{


	int a = 10;
	return &a;
}



int main()
{
	int* p = test();
	*p = 20;

	return 0;
}

如何避免野指针出现

指针要初始化

int a=0;这就是初始化
当不知到p应该初始化什么地址的时候 直接初始化为null int p=NULL***NULL本质上为0

小心指针越界

指针指向空间释放及时置null

指针使用前有效检查

0地址不属于用户 所以出现以下情况

指针初阶2_第2张图片



**如何检查有效性,任何指针使用前可以先判断一下**

```cpp
int main()
{
	int* p = NULL;
	if(p!=NULL)
	*p = 10;

	return 0;
}

指针的运算

指针±整数指针初阶2_第3张图片

int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int* p = arr;
	int* pend = arr + 9;
	while (p <= pend)
	{
		printf("%d", *p);
		p++;
	}

	return 0;
}

因为是p++是地址++,而*p++是元素++
指针初阶2_第4张图片

指针-指针

int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	printf("%d", arr[9] - arr[0]);//结果为9  指针减去指针得到的是两个指针间的元素个数



	return 0;
}

自定义函数计算字符串长度

int my_strlen(char* str)//因为穿的a地址 所以这里用字符指针接收.计算完长度返回一个整形所以用int
{
	int count = 0;
	while (*str !='\0')
	{
		count++;
		str++;
	}
	return count;
}
int main()
{

	             //abc字符串传给mystrlen时传的时a的地址
	int len = my_strlen("abc");//求字符串函数 。字符串结束标志\0 结果为3 如果有符号符号也算
	printf("%d", len);

	return 0;
}

指针—指针的方式如下

int my_strlen(char* str)//因为穿的a地址 所以这里用字符指针接收.计算完长度返回一个整形所以用int
{
	char* start = str;
	while (*str != '\0')
	{
		str++;
	}
	return str-start;//原理就是找到\0的位置
}
int main()
{

	//abc字符串传给mystrlen时传的时a的地址
	int len = my_strlen("abc");//求字符串函数 。字符串结束标志\0 结果为3 如果有符号符号也算
	printf("%d", len);

	return 0;
}

你可能感兴趣的:(算法,数据结构,c++)