c++day3 案例 数组,函数,指针

封装一个函数,利用冒泡排序,实现对整型数组的升序排序

只要传输了数组的首地址,即等于把数组传输进了函数

我的方法(在main函数中进行冒泡排序,每次传输数组中两个数的地址到子函数,然后两个指针的解引用比大小,再互换)

void seq(int *a,int *b )            //定义两个指针,方便接收传输的地址
{
	cout << *a << "  " << endl;     //检测传输过来的地址有没有问题
	cout << *b << "  " << endl;

	if (*a > *b)                     //冒泡排序的互换
	{
		int temp = *b;
		*b = *a;
		*a = temp;
	}
	cout << *a << "  " << endl;     //检测指针的解引用是否有问题
	cout << *b << "  " << endl;
}

int main()
{
	int arr[10] = {100,54,88,675,4,0,3030,92,654,300};
	
	int len = sizeof(arr) / sizeof(arr[0]);     //冒泡排序最好写这个
	for (int i = 0; i < len; i++)
	{
		int *p1 = arr; int *p2; int *p3;     //重点:这里的指针定义必须放在第一个循环里,让p1重新等于首地址
		                                     //不然,在i=1的第二个循环中,p3会是数组最后一位,而p2会是
			              //数组最后一位往后退4个字节,下标不符,变为极大的负数,使数组溢出
		for (int j = 0; j < len-1-i; j++)
		{
			p3 = p1;                  //如果不设p3,p1和p2代表的地址会相同
			p2 = ++p1;				  //++a是先加1后等式,a++是先等式后加1
			seq(p3,p2);				  //这里的p都代表的数组地址,因为是整型数组。p1代表首地址
			                          //p1++即为首地址向后4个字节,就是第二个数的地址
									  //这里将数组两个数的地址传输到子函数的指针上
			cout << "i = " << i << endl;          //检查在第几次循环中出了问题

		}
		
	}
	for (int k = 0; k < 10; k++)
		{
			cout << arr[k] << "  ";
		}
	system("pause");
	return 0;
}

纠错时应一个部分一个部分的看输出是否正确,修改起来会很方便

老师方法(直接将数组传到子函数,然后在子函数中进行冒泡排序)

void seq(int *arr,int len )            //定义了一个指针接收地址,只要传输了数组的首地址,便可 
                                         在子函数中使用数组
{
	for (int i = 0; i < len; i++)
	{
		for (int j = 0; j < len - i - 1; j++)          //冒泡排序标准操作
		{
			if (arr[j] > arr[j + 1])
			{
				int temp = arr[j + 1];
				arr[j + 1] = arr[j];
				arr[j] = temp;
			}
		}
	}
}

int main()
{
	int arr[10] = { 1,54,88,675,4,0,3030,92,654,300 };
	int len = sizeof(arr) / sizeof(arr[0]);            //冒泡排序使用
	seq(arr,len);                          //arr即为数组的首地址,这里传输的是地址
	for (int k = 0; k < 10; k++)
	{
		cout << arr[k] <<"  ";
	}
	system("pause");
	return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值