static在c中的重要作用
//下面main.a char a = 'A'; void msg() { printf("Hello "); }
int main(void) { extern char a; printf("%c",a); (void)msg(); return 0; }
隐藏
- main.a在a和msg的定义前加上static后,main.c中不能访问到他们了,利用这一特性可以在不同文件中定义同名的函数和变量,对于函数来说只有隐藏的作用,而对于变量还多出两个作用
保持变量内容的持久(全局变量)
- 存储在静态数据区的变量会在程序开始运行时就完成初始化,且该变量的内存只会分配一次,因此其值在下次调用时仍维持上此的值
static的第三个作用是默认初始化为0
- 其实全局变量也有这一属性,都是在静态数据区,内存中所有的字节默认值都是0x00。某些时候可以减少程序员的工作量。
递归函数代码
#include <stdio.h> // 告诉编译器printf函数的格式, 声明printf函数 int main(int argc, const char * argv[]) { /* 有5个人坐在一起,问第5个人多少岁?他说比第4个人大两岁。问 第4个人岁数,他说比第3个人大两岁。问第3个人,又说比第2个 人大两岁。问第2个人,说比第1个人大两岁。最后问第1个人, 他说是10岁。请问第5个人多大? 第一个人得岁数 == 10 第二个人得岁数 == 第一个人 + 2 // 12 第三个人得岁数 == 第二个人 + 2 // 14 第四个人得岁数 == 第三个人 + 2 // 16 第五个人得岁数 == 第四个人 + 2 // 18 age(n) = age(n - 1) + 2; */ int result = age(3); printf("result = %i ", result); return 0; } /*
递归函数必须满足以下2个特点 1.必须有一个明确的结束标志 2.自己调用自己 */ int age(int n) // 3 2 1 { // 定义结束条件 if (n == 1) { return 10; }else { // return 14; // return 12; return age(n - 1) + 2; } }
冒泡排序代码
int main(int argc, const char * argv[]) { int number[6] = {21,42,13,56,72,29}; hjh_short(number, 6); int i; for (i = 0; i < 6; i ++) { printf("%d ",number[i]); } printf(" "); return 0; } /* 冒泡就是两两比较取大的在前 */ void hjh_short(int a[],int n) { int i,j,temp; for (j = 0; j < n - 1; j ++) { for (i = 0; i < n - 1 - j; i ++) { if (a[i] > a [i + 1]) { temp = a[i + 1]; a[i + 1] = a[i]; a[i] = temp; } } } }
选择排序代码
// 选择排序就是拿定义k=i,拿a[k]与后面的数比较,a[k]较大时,a[k]>a[j],k = j就互换位置,最后看k=i是否成立,不能再交换了,比冒泡效率高一点 void choise(int *a,int n) { int i,j,k,temp; for(i=0;i<n-1;i++) { k=i; /*给记号赋值*/ for(j=i+1;j<n;j++) if(a[k]>a[j]) k=j; /*是k总是指向最小元素*/ if(i!=k) { /*当k!=i是才交换,否则a[i]即为最小*/ temp=a[i]; a[i]=a[k]; a[k]=temp; } }
}
快速排序代码
//快速法定义了三个参数,(数组首地址*a,要排序数组起始元素下标i,要排序数组结束元素下标j). 它首先选一个数组元素(一般为a[(i+j)/2],即中间元素)作为参照,把比它小的元素放到它的左边,比它大的放在右边。然后运用递归,在将它左,右两个子数组排序,最后完成整个数组的排序。下面分析其
插入排序代码
//插入法是一种比较直观的排序方法。它首先把数组头两个元素排好序,再依次把后面的元素插入适当的位置。把数组元素插完也就完成了排序。
其他排序算法:http://blog.jobbole.com/11745/