C primer Plus - 14 373页 结构体和函数指针

声明结构体数组:

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;如果是有符号类型的值,右移运算符的行为取决于实现

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值