gedada2019 发表于 2021-12-7 09:27

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

问题:void bubbleSort(int* arr, int len)
         我删除这里的*为什么不行??明明里面的冒泡排序不用指针也可以啊!!
#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>arr)
                        {
                                int temp = arr;
                                arr = arr;
                                arr = temp;
                        }
                }
        }
}
//打印数组
void printArray(int * arr, int len)
{
        for (int i = 0;i < len;i++)
        {
                cout << arr << endl;
        }
}
int main()
{
        //1、创建数组
        int arr = { 4,3,6,1,2,10,8,7,5,9 };
        //数组长度
        int len = sizeof(arr) / sizeof(arr);
        //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,都是表示数组的首地址。
既然实参给的是首地址,那么形参,只能定义为指针了。

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

再说下作用域吧。我们的目的是什么?
每一个子函数内部的变量对外部是绝缘的,也就是子函数内部的操作不影响外部(这里是main)。
而这个程序需要排序的结果对printArray(arr, len);可见,换个说法,我们希望数组在子函数内的数组改变后,main()里的数组也跟着改变。
那只有两种方法,一个是地址传递(指针),另一个是引用传递(别名)。
理解了函数的传递方式比较重要,如果感觉难,是函数和数组的基础没理解透。
其实此程序对于现代C++11来说是不合格的,建议形参改成引用,传递数组用迭代器,begin(arr)和end(arr),这样就有了数组的首位地址。
页: [1]
查看完整版本: 还是不太懂指针的运用!简单的使用可以,但实际使用就有很多问题!!