学习b站黑马的c++课程时发现老师的冒泡排序代码在将数组传入子函数时用了指针,子函数内部却用了数组的格式,遂对数组和指针关系起了兴趣。(老师的代码如下)
#include<iostream>
#include<string>
using namespace std;
//冒泡排序函数
void bubbleSort(int * arr, int len)
{
for (int i = 0; i < len - 1; i++)
{
for (int j = 0; j < len - 1 - i; j++)
{
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() {
int arr[10] = { 4,3,6,9,1,2,10,8,7,5 };
int len = sizeof(arr) / sizeof(int);
bubbleSort(arr, len);
printArray(arr, len);
system("pause");
return 0;
}
- 博客(C/C++数组名与指针区别深入探索_ljob2006的博客-CSDN博客),其结论“数组名作为函数形参时,在函数体内,其失去了本身的内涵,仅仅只是一个指针”部分解决了我的困惑,但对于为什么能在后面加上方括号[]任仍然没得到解答。
- 于是找到了另一篇(第四章 [ ]运算符的本质_megaboy的博客-CSDN博客),方括号前加入“指向某类型的指针”,相当于给指针加上括号内的值。
实践出真知,分别将原程序的冒泡排序子函数替换成如下两个:
void bubbleSort(int arr[], int len) //int * arr 也可以写为int arr[]
{
for (int i = 0; i < len - 1; i++)
{
for (int j = 0; j < len - 1 - i; j++)
{
if (arr[j] > arr[j + 1])
{
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp; // 传数组名,也可以改变实参
}
}
}
}
void bubbleSort(int arr[], int len) //int * arr 也可以写为int arr[]
{
int * load = arr;
for (int i = 0; i < len - 1; i++)
{
arr = load;
for (int j = 0; j < len - 1 - i; j++)
{
if (*arr > *(arr+1))
{
int temp = *arr;
*arr = *(arr+1);
*(arr+1) = temp; // 数组名可以当指针来用
arr++;
}
else arr++;
}
}
结果不变,是否能理解成在子函数中c++不认为数组名和指针有什么区别,尽管主程序中认为数组名不是指针(参考上述第一篇博客)。
楼主编程新手,理解的不知道对不对,希望大家指点一二。