吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 620|回复: 4
收起左侧

[求助] 还是不太懂指针的运用!简单的使用可以,但实际使用就有很多问题!!

[复制链接]
gedada2019 发表于 2021-12-7 09:27
问题:void bubbleSort(int* arr, int len)
           我删除这里的*为什么不行??明明里面的冒泡排序不用指针也可以啊!!
[C++] 纯文本查看 复制代码
#include<iostream>
using namespace std;
//实现两个数字进行交换

//冒泡排序函数 参数1 数组首地址 参数2 数组长度
void bubbleSort(int* arr, int len)
{
	for (int i = 0; i < len - 1; i++)
	{
		for (int j = 0; j < len - i - 1;j++)
		{
			//如果j>j+1的值 交换数字
			if(arr[j]>arr[j+1])
			{
				int temp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = temp;
			}
		}
	}
}
//打印数组
void printArray(int * arr, int len)
{
	for (int i = 0;i < len;i++)
	{
		cout << arr[i] << endl;
	}
}
int main()
{
	//1、创建数组
	int arr[10] = { 4,3,6,1,2,10,8,7,5,9 };
	//数组长度
	int len = sizeof(arr) / sizeof(arr[0]);
	//2、创建函数,实现冒泡排序
	bubbleSort(arr, len);
	//3、打印排序后的数组
	printArray(arr, len);

	system("pause");
	return 0;
}

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

bester 发表于 2021-12-7 14:30
我给你推荐一篇文章吧  我觉得写得蛮好的 因为最近我也在看指针详解,我也搞不懂什么时候用指针
但是我看完文章这些比较基础的概念我理解了
https://www.cnblogs.com/xiaoxiaocoding/p/14982340.html
视频的话 推荐慕课的 Redknot 趣味C++入门

其实很简单 你这个问题

arr是一个数组 对吧,那arr这个数组名其实就是一个内存地址

你把int* arr中的指针符号去掉,就相当于告诉编译器 bubbleSort这个函数的参数,我传递一个数值给你 而你在这个bubbleSort函数当中,你访问arr却是用数组方式  此时的arr是一个int数值,你用数组方式去访问你觉得对吗?

再提一个,你在arr里面 如果你不是用指针的方式去访问,我们知道,每个函数都有一个特定的作用域,对吧,你在bubbleSort函数是无法访问main函数的局部变量,换句话来说,你在bubbleSort函数中的arr和main函数中的arr 是两个不同的变量,这两个应该是不能互访的

不知道我的理解对不对 有错误担待一下
 楼主| gedada2019 发表于 2021-12-8 19:48
bester 发表于 2021-12-7 14:30
我给你推荐一篇文章吧  我觉得写得蛮好的 因为最近我也在看指针详解,我也搞不懂什么时候用指针
但是我看 ...

大方向我都懂,但是一到实战就不行了。我到现在都是在断断续续的自学,没有实际弄过。一直在照抄程序
bester 发表于 2021-12-8 20:03
gedada2019 发表于 2021-12-8 19:48
大方向我都懂,但是一到实战就不行了。我到现在都是在断断续续的自学,没有实际弄过。一直在照抄程序

要多练指针 多去看指针的文章 复合型指针才是最头大的
dbgcode 发表于 2021-12-22 17:46
本帖最后由 dbgcode 于 2021-12-22 18:13 编辑

贴子发这么久了,楼主应该也知道为啥。但我还是回复下楼主吧,共楼主参考。
这个帖子的主要问题是数组,理解了数组和作用域,就迎刃而解。

先谈数组在作为函数实参时,本质是给了什么。bubbleSort(arr, len);
其实吗,arr=arr[]=arr[0],都是表示数组的首地址。
既然实参给的是首地址,那么形参,只能定义为指针了。

为何给的是数组名,而编译器把实参变成首地址了?
据说是数组不支持相互拷贝,更深层的原因是所有拷贝都浪费资源,直接用原来的数据更省空间,所以默认就给了首地址。
既然是C++了,当然是追求性能的,否则就Java了。
现代C++一个原则是能用其他方式代替指针的就绝对不用指针。

再说下作用域吧。我们的目的是什么?
每一个子函数内部的变量对外部是绝缘的,也就是子函数内部的操作不影响外部(这里是main)。
而这个程序需要排序的结果对printArray(arr, len);可见,换个说法,我们希望数组在子函数内的数组改变后,main()里的数组也跟着改变。
那只有两种方法,一个是地址传递(指针),另一个是引用传递(别名)。
理解了函数的传递方式比较重要,如果感觉难,是函数和数组的基础没理解透。
其实此程序对于现代C++11来说是不合格的,建议形参改成引用,传递数组用迭代器,begin(arr)和end(arr),这样就有了数组的首位地址。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 17:29

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表