C++ Primer Tips(第六版)

零 OOP

面向对象编程与传统的过程性编程的区别在于,OOP强调的是在运行阶段(而不是编译阶段)进行决策。运行阶段指的是程序正在运行时,编译阶段指的是编译器将程序组合起来时。运行阶段决策就好比度假时,选择参观哪些景点取决于天气和当时的心情;而编译阶段决策更像不管在什么条件下,都坚持预先设定的日程安排。

一、字符

1.字符串常量和字符常量

字符串常量(使用双引号)不能与字符常量(使用单引号)互换。字符常量(如’S’)是字符串常=编码的简写表示。在ASCII系统上,'S’只是83的另一种写法;但是"S"不是字符常量,它表示的是两个字符(字符 S 和 \0)组成的字符串。更糟糕的是,"S"实际上表示的是字符串所在的内存地址。

2.sizeof 和strlen()函数

sizeof运算符指出整个数组的长度,但是strlen()函数返回的是存储在数组中的字符串的长度,而不是数组本身的长度。另外,strlen()只计算可见的字符,而不把空字符计算在内。

二、指针

指针是一个变量,其存储的是值的地址,而不是值本身。因此,指针名表示的是地址。对变量运用地址运算符(&)就能获取对应变量的位置。例如:如果home是一个变量,则&home是它的地址。*运算符被称为间接值(indirect value)或解除引用(dereferencing)运算符,将其应用于指针,可以得到该地址处存储的值。(这和乘法使用的符号相同;C++根据上下文来确定所指的是乘法还是解除引用)。

处理存储数据的策略是将地址视为指定的量,而将值视为派生量。

声明和初始化指针

指针声明必须指定指针指向的数据的类型。

顺便说一句,*运算符两边的空格是可选的。传统上,C程序员使用这种格式:

int *ptr;

如果要强调*ptr是一个int类型的值,使用如下格式:

int* ptr;

如果要强调int*是一种类型—指向int的指针。在哪里添加空格对于编译器来说没有任何区别,您甚至可以这样做:

int*ptr;

但要知道的是,下面的声明创建一个指针(p1)和一个int变量(p2):

int* p1,p2;

还有一种书写方式很特别

int **ptr;

这里ptr是指向int类型指针的指针,故ptr是个指针

对每个指针变量名,都需要使用一个*

注意:在C++中,int *是一种复合类型,是指向int的指针

最后千万别忘了每条语句最后加上分号

指针的危险

一定要在对指针应用解除引用运算符(*)之前,将指针初始化为一个确定的、适当的地址。这是关于使用指针的金科玉律。

指针和数字

指针不是整型,虽然计算机通常把地址当作整数来处理。但从概念来看,指针与整数是截然不同的类型。整数是可以执行加、减、除等运算的数字,而指针描述的是位置,将两个地址相乘没有任何意义。从可以对整数和指针执行的操作上看,他们也是彼此不同的。因此,不能简单地将整数赋给指针:

int * pt;
pt = 0xB80000000;// type mismatch

如上所示的代码是错误的,原因在于左边是指向int的指针,因此可以把它赋给地址,但是右边是一个整数。0xB80000000是老式计算机系统中视频内存的组合段偏移地址,但这条语句并没有告诉程序,这个数字就是一个地址。在C99标准发布之前,C语言允许这样赋值。但C++在类型一直方面的要求更严格,编译器将显示一条错误消息,通告类型不匹配。要将数字值作为

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值