C++复合类型

C++复合类型

**引用(&):**是为对象起的另外一个名字,引用必须被初始化,一个引用只能对应一个对象

int m = 10;
int &n = m;
int &n2;  //错误,引用必须被初始化
n = 3; //此处实际是把3赋给了m
int p = n; //与 p = m等价
int &n3 = 5;//错误,引用类型必须是一个对象
//引用类型要和对象的类型一样

指针(*)

int m = 10;
int *p = &m; //p存放着变量m的地址
cout<<*p; //输出的是m的值10
*p = 0; //此时m的值被改变,变成0

指针值

​ 1.指向一个对象

​ 2.指向紧邻对象所占空间的下一位置

​ 3.空指针

​ 4.无效指针

//空指针
int *p1 = nullptr;
int *p2 = 0;
int *p3 = null;
//指针可以初始化也可以不初始化,但建议对指针进行初始化,以避免出现一些无法预计的错误

**void *指针:**可以存放任意对象地址

int m = 3,*q = &m;
void *p = &m; //正确
p = q; //正确
//一个弊端是你并不知道该指针是什么类型,容易出错

指向指针的引用

int i = 10;
int *p;
int *&q = p; //q是指针p的别名
q = &i; //也就是p指向了i

const限定符

用来定义一个不可改变的值,因为不可改变所以要进行初始化

const int i = 10;
i = 20; //错误,i是一个常量不可被修改
const int m = sum(); //正确,运行时初始化
const int n = 10; //正确,编译时初始化
const int j; //错误,没有初始化
int k = 20;
const int y = k; //正确

默认条件const对象仅在文件内有效,如果想在多个文件之间进行共享,必须在变量定义之前添加extern关键字

//file1.cc定义并初始化一个常量,该常量能被其他文件访问
extern const int m = 10;
//file1.h添加头文件
extern const int m; //与file1.cc中的m是同一个

**constexpr 变量:**constexpr类型以便由编译器来验证变量的值是否是一个常量表达式

const的引用

const int i = 40;
const int &l = i; //正确,都是常量
l = 10; //错误,l是对常量的引用不能被修改
int &m = i;//错误,非常量无法指向常量
int n = 10;
const int &p1 = n; //正确,不能通过p1修改n的值
const int &p2 = 10; //正确
const int &p3 = p1 * 3; //正确
int &p4 = p1 * 2; //错误

指针常量与常量指针

指针常量

const int m = 3; //m是一个常量,不能被改变
int n = 10;
int *p = &m; //错误,p是一个普通指针,不能指向常量m
const int *p1 = &m ; //正确,因为p1是常量指针,可以指向常量与非常量
p1 = &n; //正确,但是不能通过*p1更改n的值,只能存放n的地址
//还有一点是指针类型必须和所指对象类型一致

常量指针:必须被初始化,而且一旦初始化完成,则它的值(存放的地址)不可被改变

int m = 10;
int n = 2;
int *const p = &m; //正确
p = &n; //错误,因为p被const修饰,是一个常量,存放的是m的地址,不允许被更改
*p = 3; //正确,因为*P没被const修饰,所以可以更改,此时m的值被更改为3
const int m = 10;
int *const p = &m; //错误
const int *const q = &m; //正确,q是一个指向常量对象的常量指针

符合类型从右向左读,从变量名称最近的地方开始解读符号和关键字对其的影响,如int *const p,关键字const只修饰了p,也就是说p是一个常量对象,在前边是一个 * 表示p是常量指针,最后是int表示是什么类型的

指针本身是一个常量但并不意味着不能通过指针修改所指对象的值,能否这样做还取决于所指对象的类型

以上是从c++ prime一书中得到,可能与其他有所差别,仅供参考,还请各位大佬指出错误与不当之处

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值