发布于: 2023-8-3最后更新: 2023-9-25字数 00 分钟

cpp数组、指针、下标运算符

编译错误或者奇怪的输出:
  1. a[0] 是多维数组的第一个元素,它是一个包含3个整数的数组 {0, 1, 2}
  1. &a[0] 是指向 a[0] 的指针,实际类型是 (*int)[3] 类型,也就是指向包含3个整数的数组的指针。
  1. &a[0] + 1 是将指向第一个元素的指针向后移动一个位置,指向下一个元素,也就是 {3, 4, 5}
  1. (&a[0] + 1)[1] 这里是错误的,因为 (&a[0] + 1) 这部分已经是指向 {3, 4, 5} 的指针,再用 [1] 去取值,超出了数组的范围。
    1. 补充:下标运算符实际上是对指针进行运算的一种便捷方式。例如,对于指针 p,表达式 p[i] 实际上等价于 *(p + i)。所以,(&a[0] + 1)[1] 实际上等价于 *(&a[0] + 2),这会导致访问数组越界。
想要取二维数组的第二行第二列的元素,正确访问:*(*(a+1) + 1), 即a[1][1].

类模板

C++ 类模板有许多高级用法,包括模板特化、非类型参数、模板成员函数和嵌套模板类等。
  1. 模板特化:你可以为模板定义特化版本,这是一种特殊的模板定义,用于特定的类型参数。
  1. 非类型参数:模板参数不仅可以是类型,还可以是值。
  1. 模板成员函数:类的成员函数也可以是模板,即使类本身不是模板。
  1. 嵌套模板类:模板类可以嵌套在其他类或模板类中。

字面字符串(literal string)

有些编译器可能会出现编译错误,没编译错误的话可能运行时错误。
试图改变一个字符串字面量的内容,这是未定义行为(Undefined Behavior)
在 C++ 中,字符串字面量(如 "123")是常量,它们存储在程序的只读内存部分。试图通过指针修改它们的值将导致未定义行为。在某些情况下,这可能会导致程序崩溃。
 

秋招复盘8.10:cpp、碎碎念
秋招复盘8.10:cpp、碎碎念
秋招复盘9.15:大厂的痛
秋招复盘9.15:大厂的痛