声明结构体数组:
struct book library[MAXBKS];
只初始化struct 某一结构的某一成员,可以
struct book haha = {.value = 10.99};
数组名library本身不是结构名,它是一个数组名,该数组中的每个元素都是struct book类型的结构变量。
结构变量名并不是结构的地址,因此在使用结构体指针指向结构变量时,要在结构变量名前面加上&运算符。
while (getchar () != '\n' )
continue
这段代码可以弥补scanf()函数遇到空格和换行符结束读取的问题
如果需要在北调函数中修改主调函数中成员的值,就要传递成员的地址
modify(&stan.bankfund);
形参中把struct某类型的指针替换成struct某类型的结构变量aa,运行到该函数时,编译器根据struct某类型模板创建了一个名为aa的自动结构变量。该结构的个成员被初始化原结构变量相应成员的值的副本。因此,程序使用原来结构的副本进行计算,然而,传递至真使用的是原始的结构进行计算。
struct fund {
char A[10];
double B;
char C[10];
double D;
};
double sum(struct fund E)
{
return (E.B+E.D);
}
int main(void)
{
struct fund F = {
"WOCAO",
4032.7,
"NIMA",
8543.94
};
sum(F);
return 0;
}
sum结果:12576.21
调用sum()时,编译器根据模板创建了一个名为E的自动结构变量。然后该结构的各成员被初始化为F结构变量相应成员的值的副本。
A = B; //把一个结构赋值给另一个结构
上列语句可以把B每个成员的值都赋值给A的相应成员。即使是数组,也能完成赋值。
函数可以返回一个结构变量,相应的,父级函数必须用一个相同结构变量接受返回的结构变量。
数组指针做函数实参:
void getval(struct A * pst)
{
...
}
union是联合,enum是枚举,只能是整数
union在任一时刻,只存储一个值,后来的赋值将覆盖所有成员之前的赋值。内存分配给union的内存大小,由类型最大的元素 size 来确定。
typedef由编译器解释,而不是预处理器
typedef int A;
A x,y[10],*z;
该定义的作用域取决于typedef定义所在的位置。如果定义在函数中,就具有局部作用域,受限于定义所在的函数。如果定义在函数外面,就具有文件作用域。
尽量用typedef定义指针,而不是用#define,否则在连续定义多个指针变量时将会遇到问题
用typedef来命名一个结构类型时,可以省略该结构的标签:
typedef struct {
int A;
int B;
} rect;
rect r1 = ...
rect r2 = ...
函数指针
void A(char *);
void B(char *);
void (*p)(char *);
char array[] = "WOCAO";
p = A;
p = A();//错误!函数名A才代表地址
(*p)(array); //函数指针形式调用A函数(贝尔实验室C和UNIX开发者)(推荐)
p = B;
p(array); //函数指针形式调用A函数(伯克利UNIX开发者)
A(array); //函数名形式调用
A和(* p)是等价的
函数指针做参数:
void show(void (* fp)(char *),char * str);
show(A,array);//调用形式1,fp = A
show(p,array);//调用形式2,fp = p
void show(void (* fp)(char *),char * str)
{
(*fp)(str);
...
}
移位运算:
左移,低位空出来的位设为0
右移,如果是无符号类型的值,空出来的位设为0;如果是有符号类型的值,右移运算符的行为取决于实现