黑马程序员 指针配合数组和函数案例 个人理解

       一开始看我也是很蒙B的。。。将数组名arr传递给函数后,为啥下面可以直接用arr[j]来找到数组的第j+1个数呢,要解决这个问题,可以先看http://c.biancheng.net/view/1472.html

       看完后(不看也行,我直接把里面的结论说出来),我们可以知道,在C++中,当给一个指针添加一个值的时候,实际上添加的值是把这个值乘以指针引用的数据类型的大小。

        对于一个int 数据类型的数组arr,arr[x]=*(arr + x),就是以arr这个首地址为开始,+x就是到第下x个地址,然后再解引用。其中要注意,这个+x,比如+1,不是说真的只加了数字1,而是加了1 *(乘号)sizeof(int),如arr + 1实际上是arr + 1 * sizeof(int)。比如arr[1] = *(arr + 1),*(arr + 1)就是指地址 arr + 1X4(这个4是int的字符) 处的值。

        同时在文章中我们可以知道,当我们定义一个指针p并将arr的地址赋值给它后,p[x]就可以理解为arr[x],也就是p[1]=arr[1]=*(arr + 1),所以,老师定义的函数void bubbleSort(int * arr, int len)中,函数中的arr就是一个新的指针,也就是形参,里面复制了实参的arr(数组名)这个地址,在函数中形参arr[j]这个操作可以等同于实参arr[j]这个操作,如果我们在函数bubbleSort里面进行&arr的话,如下:

#include<iostream>
using namespace std;
void bubbleSort(int* arr, int len);

int main(void)
{
	int arr[10] = { 4,3,6,9,1,2,10,8,7,5 };
	int len = sizeof(arr) / sizeof(int);
	cout << "实参arr的地址: " << arr << endl;
	bubbleSort(arr, len);
}

void bubbleSort(int* arr, int len)
{
	cout << "形参arr的地址:" << &arr << endl;
}

可得结果

会发现形参arr这个地址与实参arr这个地址不同,形参arr可以说是实参arr的指针,那么问题来了,实参里arr这个数组名,这个首地址,它有额外开辟空间来储存这个数组首地址吗?即arr和&arr会不同吗?

#include<iostream>
using namespace std;

int main(void)
{
	int arr[5];
	cout <<"arr的地址:                    " << arr << endl;
	cout << "验证是否开辟了新的空间存放arr:" << &arr << endl;
}

结果如下:

得到的结果是arr和&arr相同,可以这样理解,数组名arr不是一个指针,只是数组arr的首地址0039FC24的另一个我们定义的名称。

这个可以更加深的理解变量名与地址的关系:https://blog.csdn.net/qq_41668547/article/details/104713838

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值