一 隐式类型转换,强制类型转换
1>根据不同类型在内存中所占内存大小而进行默认的一个转换
int short int long int long long int float (double)
系统默认的把一个所占内存空间小的类型的数据拷贝给了所占内存空间大的类型的数据
2>有时需要将所占内存大的类型的数据赋值给所占内存小的类型的变量。这就需要用到强制类型转换。例如:
double num=4.5;
(int)num; //这个结果是整数类型,舍掉小数点后的部分。
注意:虽然(int)num是一个整型,但是num还是原来的类型和原来的数据
即强制类型转换不会改变被强制类型转换的数据。
二 排序算法
1)冒泡排序法:相邻的两个元素进行比较,若前者比后者大则交换这两个数的位置,利用上述比较方法先找到所有数中最大的数放在最后一个元素的位置。然后再从剩余的元素当中选出来最大的数放到倒数第二个元素的位置。以此类推直到把所有元素拍完序。
2)选择排序法:第一次找出所有数中最大的数并记录下标,如果下标与刚开始的时候不一样则拿这个最大的数与第一个位置的元素交换。然后在剩余的元素中再找出最大的数并记录下标,若下标变动则与第二个位置的元素交换位置。以此类推直至把整个数组所有元素排完序为止。
3)插入排序法:把一个数插入到一个有序数组的合适位置,刚开始把第一个元素当作一个有序的数组,然后把第二个数插入到这个有序数组中。然后把第三个数插入到前两个数构成的有序数组当中适当的位置。依此类推,直至全部拍完序为止。
三 函数
1)函数的三个要素:
返回值 函数名 函数参数列表
int main (int argc, char argv[])
(1)函数名:遵守标识符规范
(2)函数参数列表:就是函数从它的调用函数获得该函数所需要的信息
(3)函数的返回值:就是该函数把函数执行的结果返回给调用它的函数
2)函数在调用之前必须声明,函数声明之前需要定义函数,然后才可以调用该函数
#include<stdio.h>
void my_print(void); //函数的声明
int main(void)
{
my_print(); //函数的调用
return 0;
}
void my_print(void) //函数的定义
{
int i,j;
for(i=0; i<5; i++) {
for(j=0 ; j<=i; j++) {
putchar(‘’);
}
putchar(‘\n’);
}
}
(1)函数的声明当然跟变量声明有些类似,不过函数的声明一般放在main函数前面, 而不是放在main函数里面调用语句之前。void my_print(void);
注意:函数的声明比较特殊,在有参数的情况下,在声明的时候,参数变量名字随便写,因为它既没有分配空间也没有其它用处,也完全可以不写。函数在声明的时候参数列表的作用就是告诉编译器有几个参数,每一个参数都是什么类型。
(2)函数的定义:函数肯定会具有一定的功能,而这些功能的实现离不开具体的代码
实现,而这个代码的具体实现就是函数实体
void my_print(void)
{
函数实体(或者叫函数功能的具体代码实现)
}
这就是一个函数的定义
(3)函数的调用:就是上面例子中main函数中那一条语句:
my_print();
注意:如果函数有参数,那么当该函数在调用时才会有函数栈空间,而函数栈空间包含参数变量所占内存空间。所以说只有函数在调用时,参数变量才分配了内存空间。
3)一般函数形式 :
(1)最简单的一种函数类型
void my_function(void)
(2)有参数,无返回值的函数
void my_function(int n)
(3)有参数有返回值的函数
int my_function(int a, int b)
4)形式参数:在函数定义的时候,参数列表里的参数变量叫做形参
实际参数:在调用函数的时候,在参数列表位置所写的参数表达式叫做实参
5)变量的作用域:
当一个函数在调用的时候会单独的开辟一块新的内存空间,这个内存空间被叫做这个函数的一个栈。而当函数调用完成后,该栈内存控制权交给操作系统,调用函数已经无权管理这块内存空间了。
对于一个自定义函数,其变量仅仅只在被调用的时候在内存中占有空间,被调用前或者被调用后都不占有空间。函数仅仅只在被调用的那一个时间段,是该函数变量的生存周期该函数的作用域是该函数存在的时候整个函数内部。
6)返回值关键字return
(1)把有用的信息返回给当前函数的调用函数
(2)表示当前程序结束,把程序的控制权从当前函数转换到当前函数的调用函数。
7)递归函数:自己调用自己的函数