C语言 指针及冒泡排序

指针

一.野指针

含义:访问数组越界所导致的,

造成野指针的可能性

1.指针未初始化

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

	int n = 20;
	int* p2 = &n;
	*p2 = 50;

	return 0;
}

2.指针越界访问

int main()
{
	int arr[10] = { 0 };
	int* p = &arr[0];
	int i = 0;
	for (i=0 ;  i<= 11;i++)
	{
		*(p++) = i;
	}
	return 0;
}

3.指针指向的空间被释放

int* Test()
{
	int n = 100;
	return &n;
}

int main()
{
	int*p= Test();
	printf("%d\n",*p);
	return 0;
}
  1. 赋为空指针
int main()
{
	int a = 10;
	int* p = &a;

	int* ptr = NULL;
	*ptr = 100;
	return 0;
}

6.返回栈空间地址的问题(局部变量都放在栈上)

int* test()
{

	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	return arr;//局部变量,出作用域销毁
}
int main()
{
	int* p = test();
	//p就是野指针
	return 0;
}

二.如何预防野指针

这里可以利用assert断言防止野指针出现,如要使用assert就需要引用头文件**#include <assert.h>**,具体可以查询链接: [link](链接: link)

例如

int main()
{
	int a = 10;
	int* p = NULL;
	assert(p);
	return 0;
}

这里的运行结果就是图片:
)

这里可以使用#define NDEBUG来禁止assert断言

在这里插入图片描述
这里代码就不会报错

冒泡排序

比较相邻的元素。如果第一个比第二个大,就交换他们两个。

对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。

针对所有的元素重复以上的步骤,除了最后一个。

持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较

void sort(int* arr, int sz)
{
	//确定冒泡排序的趟数
	int i = 0;
	for (int i = 0; i < sz - 1; i++)
	{
		//一趟冒泡拍序
		int flag = 1;//假设数组是有序的
		int j = 0;
		for (j = 0; j < sz - 1 - i; j++)
		{
			if (arr[j] > arr[j + 1])
			{
			int tmp = arr[j];
			arr[j] = arr[j + 1];
				arr[j + 1] = tmp;
				flag = 0;//不是有序的·
			}
		}
		if (flag == 1)
		{
		break;
		}
	}
}
void print(int* arr, int sz)
{
	int i = 0;
	for (int i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
}
int main()
{
	int arr[] = { 9,8,7,6,5,4,3,2,1,0 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	sort(arr, sz);
	print(arr, sz);
	return 0;
}

这里是运行结果
在这里插入图片描述

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值