C++中的指针(*)、引用(&)、const详解(一、定义变量)

一、前言


本人作为一个工作了5年的程序员,程序生涯最初是从c/c++开始的,但是始终不能很熟悉的理解c语言中的指针和c++中的引用,归其原因,一部分自己没有静下心来思考,一部分原因是其自身的复杂性。

二、符号的多义性

我们定义一个变量 int a=10;那么我们可以看到它(基本类型)由声明符列表+变量名(a)组成;指针和引用实际是复合类型,它的声明符列表由多个类型构成(int *,int &),其中它最终的类型由紧靠它的那个类型决定。

1、*可以表示变量是指针类型,通常紧跟声明的变量,例如int *a;

2、*可以表示解引用,通常用在取单独的指针所指向的对象,前提对象必须是指针类型,例如*a;

3、&可以表示取地址符,通常用在表达式右侧紧跟一个变量如 int *a=&b,它要赋值的对象必须是指针型的变量;

4、&可以表示引用,也就是别名int &a=b,一般在等号左侧(引用型变量一般必须初始化);

5、&&右值引用(一般要给它赋值的对象是即将消失的临时变量),&一般称为左值引用

6、&的其他用法,比如作为运算符且、与等(结合语境很容易知道,不做展开)

三、什么是指针

指针的本质是一个对象,存放的是变量的地址,例如,我有十个箱子,其中一箱有珠宝,我写了个小纸条(纸条内容是哪个箱子放珠宝),放在了确定的箱子中,这个箱子就是指针对象,这个箱子贴个标签就是指针类型的。

看一段代码

    int a=10;
    int *b = &a;  a的地址给整型指针b

    std::cout << b;
    std::cout << std::endl;
    std::cout << *b;

    return 0;
}

我的输出结果

查看内存,确实b的值为上者,之歌地址里面存了一个10

注意:

指针指向对象的类型必须要个匹配,否则发生错误

指针的状态有指向对象、指向紧邻对象控件的下一位置、空指针(为了避免错误一般指针变量赋值nullptr)、无效指针

*p是解指针

**p值指针的指针,一般的指针符号*的多少无限制

int *p=&a等效int *p=nullptr,p=&a,标识对指针赋值,*p=10表示对p指向的对象赋值

赋值改变的永远是左侧对象

void*是特殊指针们可以存放任意类型 可以通过static_cast推导取出来

三、什么是引用

引用的本质是别名(其实是对指针的封装),不是一个对象。例如我们有个同事叫王伟,我叫他小王,小王就是引用,而不是小王的克隆人,户口本上也没有小王。

定义引用时,程序把引用和它的初始值绑定(bing),初始化完成,不能再绑定。

注意:

引用必须类型严格匹配,常量指针和基类-动态类型变化除外

引用只能绑定在对象上,不能是字面值(10等数字)和表达式

不存在引用的引用

非常量引用的初始值必须是左值,即不能是表达式得出的临时值和字面常量(10)

看一段代码

int main()
{
    int a=10;
    int &b = a;

    std::cout << a;
    std::cout << std::endl;
    std::cout << b;

    std::getchar();
    return 0;
}

结果是10 10

四、什么是const常量

 一个变量被const修饰,表示它初始化后不能再变,它存在全局区,其右侧可以使一个常量,也可以是变量,还可以是表达式,可以使左值也可以是右值,只要能初始化就ok,它只是限定了定义的量不能再变。

const int a=10;a=20;会触发编译器报错

五、几种组合

左值持久,右值短暂(右值是临时变量或字面常量),左右的初始含义:右值是只能出现在右侧,左值是既可以左又可以右

a、指针的指针**p

b、不存在引用的引用(&&p)

c、指针的引用(*&p)标识给指针类型的变量起了个别名,最终什么类型看紧邻变量的限定符,本例中是&

int x = 10;
int *a=&x;
int *&b = a;

d、不存在引用的指针(&*p),因为引用不是对象

e、常量指针 const int *p;标志这个指针不能变(地址不能变),但是这个量管不着(const不直接修饰变量,成为底层const,否则称为顶层const,顶层的不可以变)

int a=10;
const int *b = &a;
a = 20;

f、指针常量 int * const p;p不能被重新赋值

g、常量引用 const int  &p;p不能被赋值

h、引用常量 ,可以赋值

int a=10;
int & const b = a;
b = 20;

有不懂的伙伴可以加群交流:568055323

原文地址:https://www.cnblogs.com/xietianjiao/p/10919679.html