声明与定义的关系
在c++程序中的声明分为定义声明和引用声明,其中定义声明简称为定义。
定义声明意味着它将导致编译器为变量分配内存空间。
引用声明:引用声明命令计算机使用在其他地方定义的变量。
字符串结尾的空字符
用双引号括起来的字符串隐式地包括结尾的空字符,因此不用显示的包括它。例如:
char bird[11] = "Mr.Cheeps";
char dog[4] = {'a','d','s','f'}; //不是一个字符串,只是一个字符数组
char cat[4] = {'q','w','e','\0'}; //是一个字符串
读取一行字符串输入
getline()和get()函数:两个函数都读取一行输入,直到到达换行符。随后,getline()将丢弃换行符,而get()将换行符保留在输入序列中。
函数strlen()
函数strlen()计算数组长度时,从数组的第一个元素开始计算字节数,知道遇到空字符('\0')。例如:
char a[3] = {'0','1','2'};
cout << "数组a长度: " << strlen(a) << endl; // 输出结果不确定,但是strlen(a)>=3
共用体
公用体(union)是一种数据格式,它能够存储不同的数据类型,但只能同时存储其中一种类型。
指针的危险
在C++创建指针时,计算机将分配用来存储地址的内存,但不会分配用来存储指针所指向的数据的内存。即,一定要记得对指针初始化。例如:
int * fellow;
*fellow = 2333;
上面的fellow确实是一个指针,但是fellow不知道指向哪里。因为没有将任何地址赋给fellow,所以fellow可能是任何值。不管fellow的值是什么,程序都将它解释为存储2333这个数据的地址。如果fellow的值恰巧是1200,计算机将把数据放在地址1200上。
new和delete的使用
new和delete要成对出现,即new出来的堆内存使用完以后要用delete释放内存,避免内存泄漏。但不要用delete释放同一内存块两次。new运算符返回未命名的内存的地址。
int * ps = new int; // 用new分配内存
...... // 使用内存
delete ps; // 释放内存
需要注意,new分配的内存块通常与常规变量声明分配的内存块不同。变量ps的值存放在栈区,而new从堆内存区域分配内存。
数组名和指针
数组名和指针基本是等价的,即C++将数组名解释为第一个元素的地址,但是对数组名应用地址运算符时,得到的是整个数组的地址。还有一种情况,将sizeof运算符用于数组名时,返回整个数组的长度(单位为字节)。
short tell[10];
cout << tell << endl; // 显示 &tell[0],&tell[0]是一个2字节内存块的地址,表达式tell+1将地址加2
cout << &tell << endl; //显示整个数组的地址,&tell是一个20个字节内存块的地址,表达式&tell+1将地址加20
但是指针作为一个变量,可以修改它的值,比如:pt = pt + 1; 不过数组名是不能修改的(但数组名能加1,即a[1] == *(a+1))。另一个区别是,对数组使用sizeof运算符得到的是数组的长度,而对指针应用sizeof得到的是指针的长度(与编译环境有关),即使指针指向的是一个数组。
#include <iostream>
using namespace std;
int main()
{
double wages[3] = {10000.0,20000.0,30000.0};
double * pw = wages;
char a = '8';
char *p = &a;
cout << "sizeof(wages) " << sizeof(wages) << endl; // 结果:sizeof(wages) 24
cout << "sizeof(pw) " << sizeof(pw) << endl; // 结果:sizeof(pw) 4
cout << "sizeof(a) " << sizeof(a) << endl; // 结果:sizeof(a) 1
cout << "sizeof(p) " << sizeof(p) << endl; // 结果:sizeof(p) 4
// 指针长度与编译环境有关
return 0;
}
数组的动态联编和静态联编
使用数组定义声明来创建数组时,采用静态联编,即数组的长度在编译时确定。
使用new[]运算符创建数组时,将采用动态联编,即在运行时为数组分配空间,其长度也在运行时设置。
cout输出字符串
如果给cout提供一个字符(char类型)的地址,则它将从该字符开始打印,直到遇到空字符(\0)为止。
注意:在cout和多数C++表达式中,char数组名,char指针以及用双引号括起来的字符串常量都被解释为字符串第一个字符的地址。
用cout打印char *类型的指针时,将打印字符串而不是地址,要打印字符串的地址,需将char *类型的指针强制换为其它类型,如int *类型。
结构成员的访问
如果结构标识符是结构名,则使用句点运算符(.);如果标识符是指向结构的指针,则使在用箭头运算符(->)。
还有一种访问方式,如果ps是指向结构的指针,可以用(*ps).price访问结构的price成员。