数据类型所占长度
char :1个字节
short int : 2个字节
int: 4个字节
unsigned int : 4个字节
float: 4个字节
double: 8个字节
long: 4个字节
long long: 8个字节
unsigned long: 4个字节
char*(即指针变量): 4个字节(32位的寻址空间是2^32, 即32个bit,也就是4个字节) 所有类型的指针变量都是4个字节。
栈(stack):栈又称堆栈, 是用户存放程序临时创建的局部变量,也就是说我们函数括弧“{}”中定义的变量(但不包括static声明的变量,static意味着在数据段中存放变量)。除此以外,在函数被调用时,其参数也会被压入发起调用的进程栈中,并且待到调用结束后,函数的返回值也会被存放回栈中。由于栈的先进后出特点,所以栈特别方便用来保存/恢复调用现场。从这个意义上讲,我们可以把堆栈看成一个寄存、交换临时数据的内存区。 它是由操作系统分配的,内存的申请与回收都由OS管理。
函数 对于一个 C 程序而言,它所有的命令都包含在函数内。每个函数都会执行特定的任务。有一个特别的函数,名称为 main()——该函数是程序启动后,第一个执行的函数。其他所有函数都是在main()函数中被调用的,并且它们的函数名称可以自己设定。
数据类型1 函数名称(参数列表)
{
//函数体
}
其中,
1. 数据类型1是函数的返回类型,返回类型可以是 void 或者任何对象类型,但不可以是数组类型。如果不是void,则函数体中必须保证能返回该类型的值。函数无法返回函数或数组。然而,可以定义一个函数的返回值为指针,并将该指针指向一个函数或数组。
2. 函数名称是一个标识符,需要符合标识符命令规范。
3. 参数列表可以为空,可以有多个参数,根据需求不同而不同。“参数声明”是一个以逗号分隔、由函数参数声明组成的列表。如果该函数没有参数需要传入,则这个列表为空,或者仅有关键字 void。
如,求两个数最大值的函数:
int max(int a, int b)
{
return a > b ? a : b;
}
递归(recursive)函数是“自己调用自己”的函数,无论是采用直接或间接调用方式。间接递归意味着函数调用另一个函数(然后可能又调用第三个函数等),最后又调用第一个函数。因为函数不可以一直不停地调用自己,所以递归函数一定具备结束条件。
冒泡排序
每一趟只能确定将一个数归位。即第一趟只能确定将末位上的数归位,第二趟只能将倒数第 2 位上的数归位,依次类推下去。如果有 n 个数进行排序,只需将 n-1 个数归位,也就是要进行 n-1 趟操作。
而 “每一趟 ” 都需要从第一位开始进行相邻的两个数的比较,将较大的数放后面,比较完毕之后向后挪一位继续比较下面两个相邻的两个数大小关系,重复此步骤,直到最后一个还没归位的数。
binarySearch() 二分查找,前提:数组有序
// 函数 binarySearch() 在排序好的数组中搜索
// 参数:需要搜索的元素值;待搜索的long类型数组;数组的长度
// 返回值:指向满足搜索条件的元素的指针,或者为NULL,如果数组中没有元素满足搜索条件。
long *binarySearch( long val, long array[ ], int n )
{
int m = n/2;
if ( n <= 0 ){
return NULL;
}
if ( val == array[m] ){
return array + m;
}
if ( val < array[m] ) {
return binarySearch( val, array, m );
} else {
return binarySearch( val, array+m+1, n-m-1 );
}
}
对于有 n 个元素的数组来说,二元搜索算法进行最多 1+log2(n)次比较。如果有一百万个元素,最多比较 20 次,也就是最多 20 次递归执行函数 。
结构体 结构体的字节对齐规则 原则1 数据成员对齐规则:结构(struct或联合union)的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小的整数倍开始(比如int在32位机为4字节,则要从4的整数倍地址开始存储)。 原则2 结构体作为成员:如果一个结构里有某些结构体成员,则结构体成员要从其内部最大元素大小的整数倍地址开始存储。(struct a里存有struct b,b里有char,int,double等元素,那b应该从8的整数倍开始存储。) 原则3 收尾工作:结构体的总大小,也就是sizeof的结果,必须是其内部最大成员的整数倍,不足的要补齐。
理论上讲结构体的各个成员在内存中是连续存储的,和数组非常类似,但是,C语言为了提高内存寻址效率,故意4字节对齐,即每次读取固定为4字节,这样读的快,那么就无法读1字节了,因此存char型时,也按4字节来存储,会有有一定的空间浪费,相当于空间换时间。