变量提供一个可供程序操作的存储空间。c++中的每个变量都有其数据类型,数据类型决定着变量所占内存空间的大小和布局方式。

变量定义的基本形式是:类型说明符,随后紧跟由一个或多个变量名组成的列表,其中变量名以逗号分隔,最后以分号结束。

int sum , value;

当对象在创建时获得一个特定的值,我们说对象被初始化了。

int sum = 0;

int sum = {0};

int sum{0};

int sum(0);

这4中方式都可以初始化。

声明变量和定义变量的区别

声明变量使用

extern int i;

如果对声明变量进行赋值,那就不是声明变量,而是定义变量

extern int i=1;

所以如果想使用另一个文件中的变量,需要在文件中使用extern定义变量

在函数内部,试图初始化一个extern关键字标记的变量将引发错误。

变量名由字母、数字和下划线组成。其中必须以字母或下划线开头。

变量作用域主要是以花括号为分界线,名字main定义与所有花括号之外,它和其他大多数定义在函数体之外的名字一样拥有全局作用域。一旦声明之后,全局作用域内的名字在整个程序范围内都可使用。

引用为对象起另外一个名字。

int i = 1;
int &refi = i;

refi就是i的另一个名字

int &refi; //错误,引用必须初始化

定义引用时,程序把引用和他的初始值绑定到一起,而不是将初始值拷贝给引用。引用无法重新绑定到另外一个对象。

对指针的引用

int i = 42;
int *p;
int *&r = p; //r是一个对指针p的引用
r = &i; //p指向i的地址
*r = 0; //把i值设置为0

指针是指向另外一种类型的复合类型

1、指针本身就是一个对象,允许对指针赋值和拷贝,可以先后指向几个不同的对象

2、指针无需在定义时赋初值。

3、指针不能指向引用。

int val = 1;

先定义指针再赋值

int *p;
p = &val;

定义指针时赋值

int *p = &val;

p存放的是val的地址。

通过访问指针来访问所指向的对象使用解引用。

cout << *p;

给解引用赋值实际上就是给指针所指对象赋值

*p = 0;

空指针不指向任何对象,在试图使用一个指针之前代码可以首先检查是否为空。

三种方法生成空指针

int *p1 = nullptr; //最好使用这个
int *p2 = 0;
//需要#include cstdlib
int *p3 = NULL

在条件表达式中使用指针,如果指针的值是0,条件就是false

int *p = 0;  
if (p) //条件false
int val = 1;
int *p1 = &val;
if (p1) //条件true

两个相同类型的指针进行比较,如果两个指针存放的地址值相同则他们相等,使用==。

void*是一种特殊的指针类型,可用于存放任意对象的地址,但是不知道是什么类型的对象,因此不能直接操作void*指针所指的对象。

double obj = 3.14,*pd = &obj;
void *pv = &obj;
pv = pd;

**表示指向指针的指针

int ival = 1024;
int *pi = &ival; //指向int型的数
int **ppi = &pi; //指向int型的指针

获取对象的值使用*pi和**ppi。