数组名的理解
在创建了数组后,数组名在两个地方是特殊的,其他地方都代表着数组首元素的地址。
这两个地方是 用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.将其从小按大排序。
两两比较则要比较九次则能得出最大的数。得出最大的数的过程叫一躺冒泡排序。所以我们需要进行九躺冒泡排序才能排序好。每趟冒泡排序进行的比较都逐渐减少。所以根据以上思路做出以上代码。
但是如果在第二趟冒泡排序中就已排好,但我们这个上述代码却还会执行。所以为了提高效率,我们就对以上代码进行优化。从而得出下述代码。
所以这就是冒泡排序的内容。