基本数据类型:算数类型+空类型
算数类型:整型数,字符,浮点数,布尔值
空类型:不对应具体的值,仅用与特殊的场合,例如:函数不返回任何类型的值的时候
算数类型分为:整型(包括字符和布尔值在内)和浮点型
可寻址的最小内存块为“字节”(byte)
内存的基本单元为:“字”(word),通常由几个字节组成
注意:切莫混用带符号类型和无符号类型
如果表达式里有带符号类型和无符号类型,当带符号类型取值为负时会出现异常结果,
eg:using int u=10;
int u2=-42;
cout<
cout<
初始化不是赋值,初始化的含义是在创建变量时赋予其一个初始值,而赋值的含义是把对象的当前值擦除,而以一个新的值来替代
建议初始化没一个内置类型的变量
因为函数体内置类型的对象如果没有初始化,则其值未定义
声明:使得名字为程序所知,一个文件如果想使用别处定义的名字则必须包含对那个名字的声明
定义:负责创建名字与名字关联的实体
eg:extern int i;//声明i
int i;//定义并声明i
由extern关键字标记的变量赋一个初始值,就抵消了extern的作用
eg:extern double i=3.14159//定义i
在函数体内部,如果试图初始化一个由extern关键字标记的变量,将引发错误
变量能且只能被定义一次,但能声明多次
C++的标识符由字母,数字,下划线组成,且只能以字母或下划线开头
标识符没有长度限制但大小写敏感
注意全局变量与局部变量的作用范围的区别
#include
using namespace std;
int i = 42;//全局变量
int main()
{
/*int j = 100;//局部变量
cout << i << endl;//42
cout << j << endl;//100
int k = i;//局部变量
cout << k << endl;//42
i = j;
cout << i << endl;*/100
int i = 100;//局部变量
int j = i;//局部变量
cout << i << endl;//100
cout << j << endl;//100
system("pause");
return 0;
}
引用:等同于给变量取别名
eg:
int i=2;
int &j=i;//j是i的引用,j与i绑定在一起,对其中某一个的操作都会影响原来的值
使用引用时必须得先初始化值
一旦定义了引用,就无法让其再绑定到另外一个对象,之后每次使用这个引用都是访问它最初绑定的那个对象
引用本身不是对象
指针:“指向”另外一种类型的符合类型
定义指针类型的方法:将声明符写成*d的形式,其中d是变量名
eg: double d1,*d2;//d2是指向double型对象的指针,d1是指向double型对象
指针相加是没有意义的,指针相减是两个指针之间的距离
指针存放某个对象的地址,想要获取该地址,需要使用取地址符(&)
eg: int val=42;
int *val2=&val;//val2存放val的地址,或者说val2是指向val变量的指针
val2定义为指向int的指针,随后初始化val2令其指向名为val的int对象。因为引用不是对象,没有实际地址,所以不能定义指向引用的指针
指针的值(即地址)有四种状态:
1.指向一个对象
2.指向紧邻对象所占空间的下一位置
3.空指针(NULL or nullptr),意味着没有指向任何对象
4.无效指针
如果指针指向了一个对象,则允许用解引用符(*)来访问对象
eg: int i=18;
int *p=&i;
cout<<*p<
cout<
注意:解引用操作仅适用于那些确实指向了某个对象的有效指针
const int *p与int * const p 的区别
指针就是地址 地址就是指针
指针变量是存放内存单元地址的变量
指针的本质是一个操作受限的非负整数
int *p,//定义了一个指针变量p,int *表示p只能指向int类型变量的地址(地址:内存单元的编号)
const int *p指向常量的指针,即不可以改变*p的值
int * const p常指针,即p的指向不可以改变
常规下的指针
#include
using namespace std;
void main()
{
int * p = nullptr;
int a = 5;
p = &a;
*p = 6;
cout << &a << endl;
cout << p << " " << *p << endl;
system("pause");
}
type *const point_name下的指针
#include
using namespace std;
void main()
{
int *const p = nullptr;
int a = 5;
p = &a;错误//表达式必须是可修改的左值
*p = 6;
cout << &a << endl;
cout << p << " " << *p << endl;
system("pause");
}
type int *point_name下的指针
#include
using namespace std;
void main()
{
const int * p = nullptr;
int a = 5;
p = &a;
*p = 6;错误////表达式必须是可修改的左值
cout << &a << endl;
cout << p << " " << *p << endl;
system("pause");
}
顶层const,底层const
顶层const:表示指针本身是个常量
底层const:表示指针所指的对象是一个常量
eg: int i=0;
int *const p1=&i;//不允许改变p1的值,所以p1为顶层const
const int ci=18;//不允许改变ci的值,所以ci为顶层const
const int *p2=&ci;//允许改变p2的值,所以p2为底层const
类型别名:是一个名字, 它是某种类型的同义词
传统方法使用typedef
新标准使用using
eg: typedef double D;
D hourly;//等价于double hourly
using SI=Sales_item;//SI是Sales_item的同义词