1.数据类型
对于基本的数据类型,我们一般用int就已经足够了;对于小数的处理,我们一般使用float数据类型。下面来介绍下结构型和指针型。
(1)结构型
结构体就是系统提供给程序员一种可以让自己制作新的数据类型的机制,用户可以将不同的基本数据类型或结构体组合成较为复杂的数据类型。例如:
typedef struct
{
int a;
char b;
float c;
}TypeA;
我们普通的数组,例如语句int a[3];申请了一个数组,数组a由三个整形分量组成。而语句TypeA b;也可认为是申请了一个数组,只不过数组b是由3个不同类型的分量组成的。对于数组a,a[0],a[1],a[2]分别代表数组中第一、二、三个元素的值。而对于结构体b,b.a、b.b、b.c分别对应于结构体变量b中的第一、二、三个元素的值。
再看语句TypeA b[3];它定义了一个数组,由3个TypeA型的元素组成。而每个TypeA型的元素又都是结构型的,由3个分量组成。
(2)指针型
int *a;//定义指针变量a
int b=*a;//把指针a指向变量的值赋值给b
a=&b;//把变量b的地址赋值给a
比较常用的有链表、二叉树等。
(3)构造结点
typedef struct Node//链表结点
{
int data;
struct Node *next;//指向Node型变量的指针
}Node;
在链表的基础上加一个二叉树结点,即为二叉树结点。
typedef struct TNode//二叉树结点
{
int data;
struct TNode *lchild;
struct TNode *rchild;
}TNode;
可用以上定义好的结构型来制作新结点,有两种方法:
1.TNode T;
2.TNode *T;
T=(TNode*)malloc(sizeof(TNode));//其中sizeof(TNode)是为了测量结点所占空间大小。
和动态申请结点内存相似的还有动态申请数组空间的方法:
int *p;
p=(int *)malloc(n*sizeof(int));//与上面动态申请结点相比,这里申请动态数组的长度为n,所以需要在sizeof运算符前乘以系数n。
(4)关于typedef和define
1.typedef: typedef就是给现有的数据起一个新的名字,例如typedef struct{···}TypeA;就是给结构体起了个名字TypeA。这里要注意的是,typedef只是起一个新的名字,并不是创造出一个新的数据类型。
2. #define:#define A 10 相当于给10贴了个标签是A
2.函数
如果有一段操作需要反复进行,那么可以通过调用函数来节省时间和降低代码量。下面讨论函数的一些常见的问题。
(1)被传入函数的参数是否改变
int a;
void f(int x)
{
++x;
}
执行语句a=0;f(a);执行后a的值为多少?
答案是0,而不是1。因为函数形参x在函数运行时被赋值,执行++x之后,x就被释放了,生命周期结束了。所以a没有参与函数f()的运算,值不变为1。
若要想让a依照f()函数体中的操作来改变,可用函数的引用型来实现。
void f(int &x)
{
++x;
}
执行a=0;f(a);之后,a的值由0变为1;
(2)一位数组和二维数组作为形参
一维数组作为形参:
void f(int x[],int n)
{
...;
}
对于第一个参数上的位置,不需要限定数组长度(不需要写成f(int x[3],int n)),对于第二个参数n,用来说明将来要进行函数操作的数组元素的个数,并不一定是数组的总长度。
二维数组作为形参:
void f(int x[][maxsize],int n)
{
...;
}
二维数组的第一个括号内不需要写数组的长度,而第二个括号内必须写上数组的长度,这里数组的二维长度也必须是maxsize。