C++ 常量指针、指针常量、引用的区别

前言:
在C语言中,"&“表示取地址。在C++中,”&"不仅表示取地址,还可以表示引用,但是与指针有所差异。要理解它们的差别,需要先掌握指针、常量指针、指针常量的概念。

1.指针
指针的本质也就是变量:
它不仅有自己的地址,也有它所存放的值,只不过这个值是地址而已。

	int a = 10;
	int *p = &a; //指针变量p:也即是变量p中存放的是变量a的地址(指针)。
    uint32_t x = 0x12345678;
    uint8_t y = *(uint8_t *)(&x); //强制类型转换,按照强制类型来访问内存,这里的y=0x78。

2.常量指针与指针常量
当const关键字和指针结合的时候,有两种形式:
1、常量指针:也就是指针指向的变量为常量,指针指向的地址可以变,但指针指向的地址里的内容不能改变。

    uint32_t c = 20;
    uint32_t d = 50;
    const uint32_t *cp; //常量指针
    cp = &c;
    *cp = *cp + 2; //报错,因为指针指向的地址里的内容不能改变。
    cp = &d; //可以修改,

2、指针常量:指针是常量、也就是指针指向的地址不能变,但指针指向的地址里的内容可以改变。

    uint32_t c = 20;
    uint32_t d = 50;
    uint32_t *const cp1 = &c; //指针常量,必须初始化
    *cp1 = *cp1 +2; //可以修改指针指向的地址里的内容
    cp1 = &d; //报错,因为指针指向的地址不能改变。

3.引用

    uint32_t c = 20;
    uint32_t &g = c; //初始化,这里g就是c的引用,操作g就相当于操作c

那在C++中,为什么要增加引用的概念呢?
其实,引用也就是指针常量,它是一个对象的别名,既然初始化了所指向的地址,那么它一定不为空,而且地址不可变。
引用对比与指针,更加安全,因为在使用指针的时候,往往都需要先判断是否为NULL,而引用可以直接用。

4.总结
指针和引用都可以作为函数的形参,以便于达到修改实参的作用,一般来说,使用指针更加灵活、而使用引用更加安全(不用判断是否为NULL)。

但是作为API的调用者来说,指针的形参更加符合“直觉化”,也就是能看出来该参数是作为输出用的,而引用的调用可能和值传递混淆。比如:

A.getfunc(&h, &s, &v); // 明显看出h,s,v是作为输出
A.getfunc(h, s, v);//可能是引用、也可能是值传递

所以在设计的时候,其本质就是在掌握不同方式之间的优缺点,并进行对比权衡,也就是所谓的trade-off。

你可能感兴趣的:(C/C++,C++,指针,引用,指针常量,常量指针)