cpp数组、指针、下标运算符
编译错误或者奇怪的输出:
a[0]
是多维数组的第一个元素,它是一个包含3个整数的数组{0, 1, 2}
。
&a[0]
是指向a[0]
的指针,实际类型是(*int)[3]
类型,也就是指向包含3个整数的数组的指针。
&a[0] + 1
是将指向第一个元素的指针向后移动一个位置,指向下一个元素,也就是{3, 4, 5}
。
(&a[0] + 1)[1]
这里是错误的,因为(&a[0] + 1)
这部分已经是指向{3, 4, 5}
的指针,再用[1]
去取值,超出了数组的范围。
补充:下标运算符实际上是对指针进行运算的一种便捷方式。例如,对于指针
p
,表达式 p[i]
实际上等价于 *(p + i)
。所以,(&a[0] + 1)[1]
实际上等价于 *(&a[0] + 2)
,这会导致访问数组越界。想要取二维数组的第二行第二列的元素,正确访问:
*(*(a+1) + 1)
, 即a[1][1].类模板
复习:C++11模板 新特性:第 2 章 语言可用性的强化 现代 C++ 教程: 高速上手 C++ 11/14/17/20 - Modern C++ Tutorial: C++ 11/14/17/20 On the Fly (changkun.de)
C++ 类模板有许多高级用法,包括模板特化、非类型参数、模板成员函数和嵌套模板类等。
- 模板特化:你可以为模板定义特化版本,这是一种特殊的模板定义,用于特定的类型参数。
- 非类型参数:模板参数不仅可以是类型,还可以是值。
- 模板成员函数:类的成员函数也可以是模板,即使类本身不是模板。
- 嵌套模板类:模板类可以嵌套在其他类或模板类中。
字面字符串(literal string)
有些编译器可能会出现编译错误,没编译错误的话可能运行时错误。
试图改变一个字符串字面量的内容,这是未定义行为(Undefined Behavior)。
在 C++ 中,字符串字面量(如 "123")是常量,它们存储在程序的只读内存部分。试图通过指针修改它们的值将导致未定义行为。在某些情况下,这可能会导致程序崩溃。
- 作者:Olimi
- 链接:https://olimi.icu/article/2ba0f71d-5181-4892-949c-22b3f682add1
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。