疫情所迫,希望用这种方法督促自己坚持学习。同时记录在找工作过程中的艰辛不易。博客内容持续增减修改,都为摘录和个人理解。欢迎各位批评指正其中错误,相互勉励,共同进步。
变量的声明和定义
声明和定义
准确理解声明和定义的区别是十分重要的。当一个工程由多个文件所构成,声明使得变量被所有的文件所熟知。一个文件如果想要使用别的文件中的变量,就必须包含对该变量的声明。 定义负责创建与名字相关联的实体。
extern int i; //对i进行声明
int i; //对i进行定义
变量的作用域
变量分为局部变量和全局变量。当我们重复定义一个变量时,后面会覆盖掉前面的内容。除非使用域操作符,如下代码所示:
int i = 10;
void main()
{
for (int i = 0; i < 5; ++i) {
cout << i << endl; //随着循环输出0,1,2,3,4
cout << ::i << endl; //始终输出10
}
}
引用
引用就是为变量取得另外一个名字。其基本定义方式如下:
其中ip就是变量i的引用
int i;
int &ip = i;
需要注意以下几点:
int &a; //错误,引用需要指定确定的对象
int &a = 10; //错误,引用初始化值必须是一个对象
char b;
int &a = b; //错误,引用与对象必须是相同的类型
指针
指针就是指向一种类型的复合类型。指针也是对象,允许拷贝和赋值。其基本定义方式如下:
int *p1, *p2; //定义了两个指向int类型的指针
double p1, *p2 = &p1; //p2为指向p1的指针
double *p3 = p2; //*p3的值等于*p2等于p1
指针的值应该属于以下4种状态的一种:
- 指向一个对象;
- 指向紧邻对象所占空间的下一位置;
- 空指针,意味着指针没有指向任何对象;
- 无效指针,除以上的其余情况;
空指针的赋值方法
int *p1 = nullptr;
int *p2 = 0;
int *p3 = NULL;
void*类型指针
void*类型的指针可以指向任意类型的数据
double a , *p1 = &a;
void *p2 = &a;
p1 = p2
指针的指针
由于指针存储的是指向元素的地址,因此该地址的存储空间也有地址,就存在指针的指针。以此类推也会有指针的指针的指针。
char a, *p1 = &a;
char **p2 = &p1; //指针的指针
//因此该代码中,**p2 = *p1 = a
指向指针的引用
引用不是对象,不能定义指向引用的指针。但是指针是对象,所以存在对指针的引用。
int i = 10;
int *p1;
int *&p2 = p1;
p2 = &i;
cout << *p1 << " " << i << endl; //输出为10 10
*p2 = 0;
cout << *p1 << " " << i << endl; //输出为0 0