摘要:
在C++的学习中,有人经常搞不清楚“常量指针”和“指针常量”这两个概念。其实简单一点讲,“常量指针”所指向的地址上的数据是常量,而“指针常量”所指向的地址是常量,地址上面的数据是可以变化的。下面看及格简单的例子,可以说明他们的区别:第一个1voidmain(){2char*str1={"Hello"};3char*str2={"HelloWorld"};4char*constptr1=str1;5//指针常量--指针本身是常量,指向的地址不可以变化,但是指向的地址所对应的内容可以变化67ptr1=str2;//错误因为这是一个常量指针,改变指向的地址了89printf("%s\n",*ptr1 阅读全文
文章分类 - c++(转)
引用的本质是什么?
2010-12-16 00:05 by Rollen Holt, 7398 阅读, 收藏, 编辑
摘要:
在大学的时候,教材里这么说的“引用是个别名...引用作为目标的别名而使用...引用不是值不占存储空间...引用只有声明,没有定义...”那么,引用到底占不占内存空间,引用的本质是什么?下面举个例子:int a = 10;int &b = a;这里,显然,b是一个引用。语句“int a = 10;”,在内存中申请了一个int型变量,32位机中占4个字节,那么变量名a放哪里了呢,有些人可能会有这个疑问。其实a代表的是一个内存地址,you know,计算机访问内存中的数据,全部是通过地址进行访问(这个结论你可以从《汇编》的寻址方式中得出)。在编译器将你的代码生成目标文件时,它会用这个地址替代所有的a 阅读全文
奇怪的const
2010-12-16 00:04 by Rollen Holt, 220 阅读, 收藏, 编辑
摘要:
const在c++中意味着“不可改变”,但在有些情况下我们可以“合法”地绕过编译器去修改一些const数据,比如const_cast就可以剥离一个对象的const属性。然而,我们这样做在多大程度上是“合理”的,却因不同的问题而论,也许一不小心,你就可能掉入陷阱之中。以下问题,我只分析,不说话,请各位看官自己判断。当目标是一个常数这件事源于在网上看到的一篇文章,其来源已经不可考,但大意是:就如下C++程序,其输出是什么:voidfoo(){constinta= 1;int*p=const_castint*(&a);*p= 2;printf(" a= %d\n *p= %d\n &a= %x\ 阅读全文
C++编程易范的错误
2010-12-15 23:53 by Rollen Holt, 275 阅读, 收藏, 编辑
摘要:
C/C++语言中有许多对初学者(甚至是有经验的编程人员)来说很容易范的错误。通晓这样的错误可使你免于陷入其中。忘记初始化指针这种错误只是一般"忘记初始化变量"错误的一个特殊形式(C/C++中变量不会自动初始化,而Basic可以)。使这种错误更糟糕的原因是它的后果往往更加糟糕:void SomeFunction(){int *pnVarint nVal;nVal = *pnVar; // Bad enough.*pnVar = nVal; // Much worse.}在这个例子中,指针变量pnVar从未被赋值。因此你必须假设它含有的是杂乱的数据,从一个混乱信息指针中读数糟糕的很,因为结果肯定是 阅读全文