函数:
.关于自定义函数分配空间问题:在形参定义后,并不会立即分配空间,而是在函数被调用时才会真正的分配内存空间
数组:
1。数组名代表数组的地址。(%p——获取数组的地址)
2。先定义的数组在内存单元里分配高地址,后定义的分配低地址。
3.存储方式:
1)计算机会给数组分配一块连续的存储空间
2)数组名代表数组的首地址,从首地址位置,一次存入数组的第1个,第2个。。。。第n个元素。
3)每个元素占用相同的字节数(取决于数组类型)。
4)并且元素之间的地址是连续的。
4。数组名是一个常量,存储的是数组的首地址
5。数组作为函数参数有两种形式:
1)一种是把数组元素作为实参使用。
2)一种是把数组名作为函数的形参和实参使用。(比如定义一个函数的形参为数组,那么调用该函数时使用的实参也必须是数组名)
注意: 1)在实现实参和形参传递时不是“值传递”,而是“地址传递”,实参数组名将该数组的起始地址传递给形参数组,两个数组共享
一段内存单元,编译系统不再为形参分配存储单元。
2)数组作为函数参数后,数组的长度信息会丢失,变成地址长度。
3)C语言中规定,不管什么数据类型的数据,数据的内存地址在内存中都只占8个字节。
几种排序方法
1.冒泡排序:
思想:大数沉淀,小数气泡。
代码实现:
<span style="font-size:14px;">#include <stdio.h>
//定义一个冒泡的函数
void maoPao(int arr[],int len){
int temp;
for (int i=0; i<len-1; i++) {
for (int j=0; j<len-1-i; j++) {
if(arr[j]>arr[j+1]){
temp = arr[j+1];
arr[j+1] = arr[j];
arr[j] = temp;
}
}
}
}
int main(int argc, const char * argv[]) {
int a[10] = {11,21,222,1,33,23,111,232,55,43};
maoPao(a, 10);
for (int i=0; i<10; i++) {
printf("%d\t",a[i]);
}
printf("\n");
return 0;
}
</span>
2.选择排序
思想:
首先在未排列序列中找到最小的元素,放到排序序列的起始位置,然后在再从剩余未排序序列中继续找到最小元素,放到排序序列的尾部。以此类推,直到排序完成!
代码实现:
<span style="font-size:14px;">#include <stdio.h>
//实现选择排序函数
void xuanZhe(int arr[],int len){
int temp;
for (int i = 0; i<len-1; i++) {
for (int j=i+1; j<len; j++) {
if(arr[i]>arr[j]){
temp = arr[j];
arr[j] = arr[i];
arr[i] = temp;
}
}
}
}
int main(int argc, const char * argv[]) {
int a[10] = {22,11,23,2,33,444,555,44,323,14};
xuanZhe(a, 10);
for (int i=0; i<10; i++) {
printf("%d\t",a[i]);
}
printf("\n");
return 0;
}</span>
思想:
在有序表中去中间元素作为比较对象,若给定值和中间值相等,则查找成功;若给定值小于中间元素,则在中间元素左半区继续折半查找;若大于时,则在中间元素的右半区继续折半查找,直到查找成功。若该区域没有相等的元素,则查找失败!
代码实现:
<span style="font-size:14px;">#include <stdio.h>
//折半查找的实现
int zheBan(int arr[],int len,int keyValue){
int low = 0,heigh = len-1,mid ;
while(low<=heigh){
mid = (low+heigh)/2;
if (arr[mid]>keyValue) {
heigh = mid - 1;
}else if (arr[mid]<keyValue){
low = mid + 1;
}else if (arr[mid] == keyValue){
// 找到相等的值,返回该值在数组的脚标
return mid;
}
}
//没有找到,返回 -1
return -1;
}
int main(int argc, const char * argv[]) {
int a[10] = {11,22,33,44,55,66,77,88,99,1010};
int keyvalue = 33;
//数组中与要查找的值的脚标
int loc = zheBan(a, 10, keyvalue);
printf("数据在数组中的位置:%d\n",loc);
return 0;
}
</span>
折半查找插入一个值
代码实现:
<span style="font-size:14px;">#include <stdio.h>
//折半查找的实现插入一个值返回插入值的位置
int zheBan(int arr[],int len,int keyValue){
int low = 0,heigh = len-1,mid ;
while(low<=heigh){
mid = (low+heigh)/2;
if (arr[mid]>keyValue) {
heigh = mid - 1;
}else if (arr[mid]<keyValue){
low = mid + 1;
}else {
// 找到相等的值,返回该值在数组的脚标
return mid + 1;
}
}
//没有找到,返回 -1
return low;
}
//将需要插入的值插入到数组中去
int insertValue(int arr[],int len,int key,int loc){
for (int i=len; i>=loc; i--) {
arr[i] = arr[i-1];
}
arr[loc] = key;
return 0;
}
int main(int argc, const char * argv[]) {
//这里定义11个元素,是为了插入一个值
int a[11] = {11,22,33,44,55,66,77,88,99,1010};
int keyvalue = 35;
//要插入值应插入数组中的脚标值
int loc = zheBan(a, 10, keyvalue);
//将keyvalue插入到数组中去
insertValue(a, 11, keyvalue, loc);
for (int i=0; i<=10; i++) {
printf("%d\t",a[i]);
}
printf("\n");
return 0;
}
</span>