结构、联合和枚举

最近准备找工作,所以就看了下c。。。

下面分享下一些小的收获。。。

1.我们常会遇到这样的代码:

这个函数分配了一个name结构体的实例,并调整它的而大小,以便将请求的名称置入namestr域里。

另一种则是将namestr[MAX]定义的很长。

这两种做法都不是很符合c标准。

真正安全的做法是使用字符指针,而不是数组。

 

2.结构体的传递和返回是如何实现的?

 

当结构体作为函数参数传递的时候,通常会把整个结构都压栈。这样所需要的空间代价就比较大,所以经常传递指针,但是为了保证按值传递的语义,他们可能不得不保留一份局部副本。

 

3.怎样从/向数据文件读/写结构?

 用fwrite来编写一个写结构的程序相对较简单:

fwrite(&somestruct, sizeof(somestruct), 1 ,fp);

对应的fread调用可以再把它读回来。

但是这样的读写有很大的局限,当结构体中含有指针时,将只能读取指针却不能读取指针所指向的内容。

4 sizeof 的返回值的问题。

因为在程序编译的时候编译器会将数据进行对齐,这样方便数据的操作,在32系统中一般为4字节对齐。所以相邻不满4字节的两个数据放在一起,超过则分开。

5 怎样在运行时用名字访问结构体中的域。

创建一个表,保存名称和用offsetof()宏计算出的域偏移量。结构a和b域的偏移量的计算方法如下:

       offsetb=offsetof(struct a, b)

如果structp是一个结构体实例指针,而域b是int型,b的值可以这样间接的设置:

       *(int *)((char *)structp +offsetb)=value;

6 联合体跟结构体的区别。

 

联合体本质上是一个成员相互重叠的结构,某一时刻你只能使用一个成员。联合体的大小是它最大成员的大小,而结构体的大小是它所有成员的大小之和。

 

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值