-函数
格式:声明输出变量类型 函数命名(参数){函数代码}
example:int sum(int a,int b){
int c=a+b;
return c;
}
使用时直接打函数名 如:int num=sum(10,20);
其中sum就是一个求和函数,上述代码表示求10与20的和用int类型的变量num接收函数结果,打印后可得num=30;同样我们可以按照上述函数构造格式自己定义需要的函数如求差求乘积函数等甚至很多复杂函数(函数库)
函数可以将相对独立的某个功能提取出来这样可以在其他程序中多次重复使用 即函数的封装
-形参和实参
上面函数中 a、b都是int类型的形式参数,10、20是实际参数,形参实参之间仅是值的传递,将10传递给a、将20传递给b,于是函数中a+b才能得到实际数据结果c也是形式参数
-数组
格式:元素类型 数组名称[数组长度];
example:int a[10];
下标从0开始,直到长度-1;字符数组需要 \0 作为结束符号,因此需要多一个长度。利用下标访问数组中的元素,数组绝不能越界 所以在写入数组时需添加安全判断避免出现数组越界情况,一旦创建则不能更改大小
数组是一段有序的数据容器 在内存中是一段连续的内存(指针偏移),数组中只能存放一种类型的元素注:字符串就是用字符数组存储的
数组的遍历一般是利用for循环 对数组中元素一一访问遍历:for(int i=0, i < array.length, i++)
length = sizeof(array)/sizeof(array[0]); 这样当数组的元素类型改变时 不需要改变其求数组长度的代码
数组本身不能赋值 若要将一个数组赋值给另一个数组只能采取遍历的方法,数组作为函数参数时往往必须用另一个参数代表该数组的大小并传入,不能在传入的数组的[]中给出数组的大小
字符串是字符数组 char[4] 代表四个字符的字符串
-指针
取地址符&取得的既是该变量在内存空间中的地址,指针就是保存地址的变量
int *p = &i; 这段代码表示的就是取出变量i的地址并赋予变量p,若有 i = 24; 则可得 *p == 24; 普通变量的值就是实际的值:i == 24;而指针变量的值是具有实际量的变量的地址 虽然有 *p == i == 24; 但p是一个十六位进制的数字,表示内存空间的地址
在函数中有形参和实参的问题 直接对其数据进行操作有很多不便之处,比如若要写一个函数并传入两个参数 该函数实现交换传入的两个参数的值这一功能 由于在函数中两个参数都是形参 直接交换它们俩的值对函数外的main函数中需要交换值的两个参数没有任何影响,即该函数没有达到我们预想的效果。此时若用指针在该函数内直接在内存空间上对需要交换值的变量进行操作,结果通过指针返回,即可解决上述问题。
符号 * 是一个单目运算符 用来反问指针的值所表示的地址上的变量
-指针与数组的关系:
函数参数表中的数组实际上就是指针 数组变量是特殊的指针 数组变量本身就表示地址所以取数组的地址时不需要使用取地址符& eg: int a[10]; int*p = a; 但数组元素表示的是变量 取地址时需要使用取地址符&
eg: int*p = &a[0]; 实际上由于数组就是一种指针 所以对于数组有这样的关系:a == &a[0]; p[0] == a[0];
上述的数组介绍中 数组在内存中是一段连续的内存 指针是指向内存的变量所以就有了指针偏移的问题,指针的偏移会导致指针指向的内存随之偏移 而数组是一段连续的内存 所以只需获取指针的偏移量我们仍可以得到偏移后指针指向数组中哪个元素。简单介绍:
int array[4] = (11,22,33,44); int *p = array; 则有:*p == array[0]; p[0] == array[0] == 11;
指针偏移:p[3] = array[3] == 44; int *q = &array[2]; q[-1] = array[1] == 22;