tips
1. printf()与strlen()在处理字符串时是把\0当做结束标志,\0不在统计范围之内,但是sizeof()不一样,当计算字符串或者字符数组时,\0也是当做一个字符计算在内。
2.每一次循环里面可以执行多个操作,并且每一次循环的执行的操作不一定都需要一样,也可以用if语句适当调整。
数组作为函数的参数
1.数组作为函数的参数(数组传参)的时候,往函数里面传入的实参就是数组名。那么数组名到底是什么呢?数组名其实是数组首元素的地址(但是有两个场景例外),
1.sizeof(数组名)的时候,这里的数组名是表示整个数组,计算的是整个数组所占内存的大小,单位是字节。
2. &数组名,这里的数组名也表示整个数组。&数组名取出的是数组的地址。
(数组首元素的地址与数组的地址它们值是一样的,但是两者的意义完全不一样。比如说对数组首元素的地址+1,那么其指向的地址会跳过一个元素;如果对数组的地址+1,那么其指向的会跳过一个数组的字节,因此两者虽然在值上面都是完全一样,但是意义相差很大),这个其实跟后面的指针有关:指针+1,到底跳过几个字节,是和指针类型有关。
除了这两个例外,遇到的所有的数组名都是首元素的地址。
3.数组传参的时候,本质上传过去的是一个首元素的地址。不管你用int arr[ ]接收还是用int* arr去接收,函数体里面的arr这时都表示一个指针了,传过来的都是一个指针,也就是地址。因此在数组传参的那个函数的内部不能用那个公式进行数组长度的计算。要放到该函数的外面。
4.那么数组在传参的时候,为什么传的是一个数组的起始地址呢?因为函数的值传递分为传值调用和传址调用,传值调用的时候形参是实参的一份临时拷贝。假设数组传参的时候用的是传值调用。那么我的实参是一个数组。而我的形参为了接收一个数组也需要开辟一个一模一样大的空间(传值调用情况下),假设数组元素有1万个的话,这会很浪费内存。因此数组传参的时候不能这样设计,如果用传址调用,把数组首元素的地址给函数传过去,不仅会提高效率,而且会节省空间。并且由于数组在内存当中是连续存放的,因此可以顺藤摸瓜找到后面所有的元素。
5.在数组里面,arr[i]其实等价于*(arr+i),&arr[i]等价于arr+i
冒泡排序
1.冒泡排序: 两两相邻的元素进行比较,有可能的话需要交换。一套趟冒泡排序搞定一个数字,让这个数字来到最终应该出现的位置上。因此比如说需要对10个数字进行排列,需要进行九套趟冒泡排序。每趟冒泡排序又决定了该趟排序需要进行多少对比较。
2.冒泡排序: 两两相邻的元素进行比较,有可能的话需要交换。
1.一套趟冒泡排序搞定一个数字,将它放在末尾。
2.如果总共要排n个数的话,需要进行n-1趟冒泡排序。
3.每趟冒泡排序又决定了该趟排序需要进行多少对比较,每一趟冒泡排序下来进行的对数比较是要依次递减。
4.在写每趟冒泡排序的两数之间比较之前要先看一下是升序还是降序,用if语句判断一下