C++程序设计语言学习笔记:指针、数组与引用

1、在C++语言中存放及使用内存地址是通过指针和引用完成的。对于类型T来说,T*是表示“指向T的指针”的类型。

2、void* 的含义是“指向未知类型对象的指针”。除了函数指针和指向类成员的指针,指向其他任意类型对象的指针都能被赋给一个void*类型的变量。

3、字面值常量nullptr表示空指针,即不指向任何对象的指针。

4、T[size]的含义是“包含size个T类型元素的数组”。元素的索引范围是0到size-1。数组名会隐式的转换成指向数组首元素的指针。如果在自由存储上分配数组,一定要在最后一次使用数组之后把对应的指针delete[]掉

5、以0作为终止符的char数组称为C风格字符串。通常情况下,char*和const char*指向以0结尾的字符序列。

6、我们能用值的列表初始化一个数组,例如:

int v1[]={1, 2, 3, 4};
char v2[]={'a', 'b', 'c', 0};

7、字符串字面值常量是指双引号内的字符序列,如"this is a string",它以字符'\0'结尾。字符串字面值常量的类型时“若干个const字符组成的数组”。

8、原始字符串字面常量,采用R"(ccc)"的形式,表示字符序列ccc。

9、前缀是L的字符串(如:L"angst")由宽字符组成,它的类型是const wchar_t[]。前缀是LR的字符串(如:LR"(angst)")也是由宽字符组成的,类型同样是const wchar_t[]。

10、UTF-8是一种可变宽度的编码方式:常用字符占据1字节,不常用的字符占据2个字节,特别罕见的字符占据3或4字节。UTF-8字符串的结尾是'\0',UTF-16是u'\0',UTF-32是U'\0'。

11、令指针指向数组的最后一个元素的下一个位置(尾后位置)是有效的,但是不可以对它进行读写操作。

12、我们可以用过指向数组的指针加上一个索引值来访问数组元素,也可以通过直接指向数组元素的指针进行访问。对于内置数组a和数组范围之内的整数j,有下式成立:

        a[j] == *(&a[0]+j) == *(a+j) == *(j+a) == j[a]

13、指针的减法运算只有当参与运算的两个指针指向的是同一个数组中的元素时才有效。当计算两个指针p和q的差值(p-q)时,所得结果是序列[p:q)中的元素数量。

14、C++提供了两种与“常量”有关的概念:

  •         constexpr:编译时求值。
  •         const:在当前作用域内,值不发生改变。

15、const关键字将令所指的对象而非指针本身成为常量。而要想指针本身成为常量,应该用*const代替*。

16、资源必须先分配后释放。我们用new分配内存,用delete释放内存。用fopen()打开文件,用fclose()关闭文件。因此,内存和文件都是资源。一种比较好的策略是把表示某种所有权的指针全都置于vector、string和unique_ptr等资源句柄类中。

17、引用作为对象的别名存放的也是对象的机器地址。它与指针的区别主要包括:

  •         访问引用与访问对象本身从语法形式上看是一样的
  •         引用所引的永远是一开始初始化的那个对象
  •         不存在“空引用”。

18、在类型名字中,符号X&的意思是“X的引用”;它常用于表示左值的引用,因此称为左值引用。

19、普通变量的引用和常量的引用必须区分开来。

20、声明符&&表示“右值引用”。标准库提供了一个名为move()的函数:move(x)等价于static_cast<X&&>(x),其中x的类型时X。

21、左值引用优先。不管我们怎么做都无法改变左值引用绑定左值的事实。所以当出现引用某种类型的引用时得到的还是该类型的引用,而非特殊的引用类型。

22、指针和引用时两种无须拷贝就能在别处使用对象的机制。如果要更换所指的对象,应该使用指针;如果想让某个名字永远对应同一个对象,应该使用引用;如果想自定义(重载)一个运算符,使之指向对象的某物,应该使用引用;如果想让集合中的元素指向对象,应该使用指针;如果需要表示“值空缺”,应该使用指针nullptr(空指针)。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值