指针(2)

数组名的理解

在创建了数组后,数组名在两个地方是特殊的,其他地方都代表着数组首元素的地址。

这两个地方是 用sizeof(数组名)时,sizeof单独修饰数组名(只有数组名出现),数组名表示整个数组,计算的是整个数组的大小。

用&数组名时,数组名表示整个数组,得到的是整个数组的地址(&单独修饰数组名,只有数组名)。其地址类型跟数组首元素的地址类型不一样。从而计算也不一样。

除却这两个地方外,其他都代表着数组首元素的地址。

使用指针访问数组

 创建一个数组int arr[10]={0} ,一般我们访问数组是用下标引用操作符如arr[5],。

我们可能认为这个操作符用起来很复杂,非常神秘,但其实其操作符本质很简单如arr[5]。编译器其实就是将其转化为*(arr+5)再运行,所以这是其本质,

根据其本质我们也可以得知[]并不是专门适用于数组,也可以用在其他地方。只要有一个地址一个整数就能用该操作符。如

这两个例子从而证明出它不专门用于数组,也可以用于其他地方。

根据其本质我们还可以得出因为arr[i]本质是*(arr+i),而*(i+arr)跟*(arr+i)一样,i[arr]本质是*(i+arr)。所以i[arr]就是arr[i]。

 讲完这些,其实[]操作符就没这么神秘了,我们就搞懂它的本质了。

所以下标引用操作符本质就是这样,而我们定义数组时[]不是下标引用操作符,所以作用就不一样。 只有当它是下标引用操作符时本质才是这个。 

 一维数组的传参

 

   数组传参传的是数组首元素的地址,而不是整个数组。因为就内存空间来说整个数组的话占用内存太大,会造成很多问题,效率不高。所以我们都是传首元素地址。用指针变量来接收。

但是在日常中我们能看到用 int  arr[]去收arr,让我们误认为是传了整个数组。

但其实这只是为了一些新手更好理解所以才这样子表示。它实际上本质上是int *arr ,这是c语言规定默认的:在形参中int arr[]本质为int *arr。这是个固定格式,其中[]里面也可以写操作数(数组的元素个数)

所以一维数组传参,形参部分可以写成数组形式,也可以写成指针形式。但其本质都一样。

  冒泡排序

 冒泡排序是通过两两比较从而进行排序。

假设数组有十个整形元素,10,9,8,7,6,5,4,3,2,1.将其从小按大排序。

两两比较则要比较九次则能得出最大的数。得出最大的数的过程叫一躺冒泡排序。所以我们需要进行九躺冒泡排序才能排序好。每趟冒泡排序进行的比较都逐渐减少。所以根据以上思路做出以上代码。

但是如果在第二趟冒泡排序中就已排好,但我们这个上述代码却还会执行。所以为了提高效率,我们就对以上代码进行优化。从而得出下述代码。

所以这就是冒泡排序的内容。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值