手机站
网通分站
电信主站
密 码:
用户名:
当前位置 : 主页>程序设计>C/C++>列表

C/C 语言struct深层探索

来源:互联网 作者:west263.com 时间:2008-02-23
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!


  另外,通过__attribute((aligned (n)))也能够让所作用的结构体成员对齐在n字节边界上,但是他较少被使用,因而不作周详讲解。

2.3 面试题的解答

  至此,我们能够对Intel、微软的面试题进行全面的解答。

  程式中第2行#pragma pack (8)虽然指定了对界为8,但是由于struct example1中的成员最大size为4(long变量size为4),故struct example1仍然按4字节对界,struct example1的size为8,即第18行的输出结果;

  struct example2中包含了struct example1,其本身包含的简单数据成员的最大size为2(short变量e),但是因为其包含了struct example1,而struct example1中的最大成员size为4,struct example2也应以4对界,#pragma pack (8)中指定的对界对struct example2也不起作用,故19行的输出结果为16;

  由于struct example2中的成员以4为单位对界,故其char变量c后应补充3个空,其后才是成员struct1的内存空间,20行的输出结果为4。


3. C和C 间struct的深层区别
  在C 语言中struct具备了“类” 的功能,其和关键字class的区别在于struct中成员变量和函数的默认访问权限为public,而class的为private。

  例如,定义struct类和class类:

struct structA
{
char a;

}
class classB
{
char a;

}
  则:

struct A a;
a.a = 'a'; //访问public成员,合法
classB b;
b.a = 'a'; //访问private成员,不合法
  许多文献写到这里就认为已给出了C 中struct和class的全部区别,实则不然,另外一点需要注意的是:

  C 中的struct保持了对C中struct的全面兼容(这符合C 的初衷——“a better c”),因而,下面的操作是合法的:

//定义struct
struct structA
{
char a;
char b;
int c;
};
structA a = {'a' , 'a' ,1}; // 定义时直接赋初值
  即struct能够在定义的时候直接以{ }对其成员变量赋初值,而class则不能,在经典书目《thinking C 2nd edition》中作者对此点进行了强调。

4. struct编程注意事项
  看看下面的程式:

1. #include <iostream.h>

2. struct structA
3. {
4. int iMember;
5. char *cMember;
6. };

7. int main(int argc, char* argv[])
8. {
9. structA instant1,instant2;
10.char c = 'a';

11. instant1.iMember = 1;
12. instant1.cMember = &c;

13.instant2 = instant1;

14.cout << *(instant1.cMember) << endl;

15.*(instant2.cMember) = 'b';

16. cout << *(instant1.cMember) << endl;

17. return 0;
}
  14行的输出结果是:a
  16行的输出结果是:b

  Why?我们在15行对instant2的修改改变了instant1中成员的值!

  原因在于13行的instant2 = instant1赋值语句采用的是变量逐个拷贝,这使得instant1和instant2中的cMember指向了同一片内存,因而对instant2的修改也是对instant1的修改。

  在C语言中,当结构体中存在指针型成员时,一定要注意在采用赋值语句时是否将2个实例中的指针型成员指向了同一片内存。

  在C 语言中,当结构体中存在指针型成员时,我们需要重写struct的拷贝构造函数并进行“=”操作符重载。



Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=796612


[收藏到我的网摘] happytang发表于 2006年06月14日 16:22:00



特别推荐:
  • 安全第一的邮箱,拒绝黑客!
    只要您有域名,即可免费开通个性电子邮局 简单、安全、稳定、高速、超大容量,心动不如行动!
  • 中国Linux培训的西点学校
    年薪5万就业协议的Linux培训专家 国内最专业具备课程研发能力的培训机构
  • PHP 命令行?是的,您能够!
    了解如何通过命令行调试 PHP 代码 连同体验 PHP 本身的强大之
  • 主机完全DIY,域名免费试用
    时代互联100M主机 216元/年
  • 让研发自动化: 持续测试
    对代码基址的每一次更改都运行自动化测试 介绍了几种自动化的研发人员测试



文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

上一页 1 2下一页
[打印] [关闭]
Google
相关文章
上一篇: C创建新线程的源码
下一篇: C 语言的VxD和外界通信的任何接口
热点关注
IDC资讯 虚拟主机 域名注册 托管租用 vps主机 智能建站
网站运营 建站经验 策划盈利 搜索优化 网站推广 免费资源
网站联盟 联盟新闻 联盟介绍 联盟点评 网赚技巧
行业资讯 业界动态 搜索引擎 网络游戏 门户动态 电子商务 广告传媒
网络编程 Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术 Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷 Internet Explorer
网页制作 FrontPages Dreamweaver Javascript css photoshop fireworks Flash
程序设计 Java技术 C/C++ VB delphi
网络知识 网络协议 网络安全 网络管理 组网方案 Cisco技术
操作系统 Win2000 WinXP Win2003 Mac OS Linux FreeBSD
返回首页 |关于我们 | 联系我们 | 付款方式 | 创业联盟 | 价格总览 | 资讯中心 | 友情链接 | 网站地图 | 招贤纳士 | RSS