首页 考试吧论坛 Exam8视线 考试商城 网络课程 模拟考试 考友录 实用文档 求职招聘 论文下载
2012中考 | 2012高考 | 2012考研 | 考研培训 | 在职研 | 自学考试 | 成人高考 | 法律硕士 | MBA考试
MPA考试 | 中科院
四六级 | 职称英语 | 商务英语 | 公共英语 | 托福 | 托业 | 雅思 | 专四专八 | 口译笔译 | 博思
GRE GMAT | 新概念英语 | 成人英语三级 | 申硕英语 | 攻硕英语 | 职称日语 | 日语学习 |
零起点法语 | 零起点德语 | 零起点韩语
计算机等级考试 | 软件水平考试 | 职称计算机 | 微软认证 | 思科认证 | Oracle认证 | Linux认证
华为认证 | Java认证
公务员 | 报关员 | 银行从业资格 | 证券从业资格 | 期货从业资格 | 司法考试 | 法律顾问 | 导游资格
报检员 | 教师资格 | 社会工作者 | 外销员 | 国际商务师 | 跟单员 | 单证员 | 物流师 | 价格鉴证师
人力资源 | 管理咨询师 | 秘书资格 | 心理咨询师 | 出版专业资格 | 广告师职业水平 | 驾驶员
网络编辑 | 公共营养师 | 国际货运代理人 | 保险从业资格 | 电子商务师 | 普通话 | 企业培训师
营销师
卫生资格 | 执业医师 | 执业药师 | 执业护士
会计从业资格考试会计证) | 经济师 | 会计职称 | 注册会计师 | 审计师 | 注册税务师
注册资产评估师 | 高级会计师 | ACCA | 统计师 | 精算师 | 理财规划师 | 国际内审师
一级建造师 | 二级建造师 | 造价工程师 | 造价员 | 咨询工程师 | 监理工程师 | 安全工程师
质量工程师 | 物业管理师 | 招标师 | 结构工程师 | 建筑师 | 房地产估价师 | 土地估价师 | 岩土师
设备监理师 | 房地产经纪人 | 投资项目管理师 | 土地登记代理人 | 环境影响评价师 | 环保工程师
城市规划师 | 公路监理师 | 公路造价师 | 安全评价师 | 电气工程师 | 注册测绘师 | 注册计量师
化工工程师 | 材料员
缤纷校园 | 实用文档 | 英语学习 | 作文大全 | 求职招聘 | 论文下载 | 访谈 | 游戏
计算机等级考试
您现在的位置: 考试吧(Exam8.com) > 计算机等级考试 > 计算机二级 > C加加 > 复习资料 > 正文

2012年C++sizeof使用技巧及要点分析(二)

来源:考试吧Exam8.com) 2012-6-27 11:26:33 考试吧:中国教育培训第一门户 模拟考场

  使用引用的情况和指针相似

  1 int Sum(int (&i))

  2 {

  3 int sumofi = 0;

  4 for (int j = 0; j < sizeof(i)/sizeof(int); j++)

  5 {

  6 sumofi += i[j];

  7 }

  8 return sumofi;

  9 }

  10

  11 int main()

  12 {

  13 int allAges[] = {21, 22, 22, 19, 34, 12};

  14 cout《Sum(allAges)《endl;

  15 system("pause");

  16 return 0;

  17 }

  18

  这种情况下sizeof的计算同样无意义,所以用数组做参数,而且需要遍历的时候,函数应该有一个参数来说明数组的大小,而数组的大小在数组定义的作用域内通过sizeof求值。因此上面的函数正确形式应该是

  1 #include

  2 using namespace std;

  3

  4 int Sum(int *i, unsigned int n)

  5 {

  6 int sumofi = 0;

  7 for (int j = 0; j < n; j++)

  8 {

  9 sumofi += i[j];

  10 }

  11 return sumofi;

  12 }

  13

  14 int main()

  15 {

  16 int allAges[] = {21, 22, 22, 19, 34, 12};

  17 cout《Sum(i, sizeof(allAges)/sizeof(int))《endl;

  18 system("pause");

  19 return 0;

  20 }

  (7)、C风格字符串与C++风格字符串类(String)的sizeof和strlen

  考虑下面的问题

  1 #include

  2 using namespace std;

  3

  4 char a[] = "abcdef";

  5 char b[20] = "abcdef";

  6 string s = "abcdef";

  7

  8 cout《strlen(a)《endl; // 6,字符串长度9 cout《sizeof(a)《endl; // 7,字符串容量10 cout《strlen(b)《endl; // 6,字符串长度11 cout《sizeof(b)《endl; // 20,字符串容量12 //cout《strlen(s)《endl; // 错误!s不是一个字符指针。

  13 cout《sizeof(s)《endl; // 16, 这里不代表字符串的长度,而是string类的大小

  14

  15 a[1] = '"0';

  16 cout《strlen(a)《endl; // 1

  17 cout《sizeof(a)《endl; // 7,sizeof是恒定的,因为是前面已经固定分配过7个单元,虽然现在字符串变为空串

  18

  记住:String是class类型。(关于class类型的sizeof请参见第五节)

  strlen是寻找从指定地址开始,到出现的第一个0之间的字符个数,他是在运行阶段执行的,而sizeof是得到数据的大小,在这里是得到字符串的容量。所以对同一个对象而言,sizeof的值是恒定的。string是C++类型的字符串,他是一个类,所以sizeof(s)表示的并不是字符串的长度,而是类string的大小。strlen(s)根本就是错误的,因为strlen的参数是一个字符指针,如果想用strlen得到s字符串的长度,应该使用sizeof(s.c_str()),因为string的成员函数c_str()返回的是字符串的首地址。实际上,string类提供了自己的成员函数来得到字符串的容量和长度,分别是Capacity()和Length()。string封装了常用了字符串操作,所以在C++开发过程中,最好使用string代替C类型的字符串。

  STL中的String类

  string的sizeof和平台相关的,string类最简单的可以近似认为是包含两个数据成员:char *指针成员( 表示字符数组)和 int成员(表示字符串长度)。但是事实上并不是这样定义的,可能还有其他数据成员,如编译器插入指针vptr等。因此根据不同的实现,可以查看String类的定义中如何定义。比如在我现在机器上,sizeof(string) = 16。

  相关推荐:

  2012年下半年计算机等级考试报名时间及入口汇总

  计算机等级考试三级PC技术过关心得技巧

  2012年3月计算机二级考试真题汇总

文章搜索
版权声明:如果计算机等级考试网所转载内容不慎侵犯了您的权益,请与我们联系800@exam8.com,我们将会及时处理。如转载本计算机等级考试网内容,请注明出处。