🤖 AI文章摘要 qwen-turbo-latest
加载中...

数据类型

  • 原子类型: 是编译器可以操作的最基本数据类型
    • char: 字符型1U
    • short, 短整型2U
    • int: 整形4U
    • long: 长整型4U (注意long类型仍然是4U, long long才是8字节)
    • float: 单精度浮点型4U
    • double: 双精度浮点型8U
  • 结构类型: 是由原子类型和指针类型复合而成的自定义类型. 大小不固定.
    • struct struID{ /*def*/}: 结构体类型, struID是类型标识符, 若仅使用一次可忽略
    • union uionD{/*def*/}: 联合体类型, unionD是类型标识符, 若仅使用一次可忽略
    • enum enumID{/*def*/}: 枚举类型, enumID是类型标识符, 若仅使用一次可忽略
    • Type [N]: 数组类型, 数组中每个元素都是Type类型
  • 指针类型: 该类型的对象用来存储计算机内存地址, 指针类型的大小取决于CPU的位数.
    • 原子类型指针: Type*
    • 结构类型指针: 一般Type*, 数组是Type(*)[N]
    • 多级指针: 即指向指针的指针, 高级指针使用多个*表示
  • typedef: 作用是为复杂数据类型取别名, 同时增强代码的可阅读性和可移植性.
    • 一般语法: typedef Type Alias
    • 数组语法: Type (alias)[N]

变量与常量

  • 变量: 即状态不断发生变化的量. C语言的变量有数据类型, 且可以寻址.
    • 一般语法: Type objName, 指针Type *objName
    • 数组语法: Type arrName[N], 指针Type(*arrName)[N]
  • 常量: 即状态不会发生变化的量. C语言的常量有数据类型, 且可以寻址.
    • 一般语法: Type const objName, 指针Type * const objName
    • 数组语法: const Type arrName[N], 指针Type(* const arrName)[N]
  • 数值字面量: 即代码中直接书写的数值量. 它们编译成立即数成为指令的一部分, 不可寻址.
    • 整形字面量默认为int类型, 加上L可以声明为long类型
    • 浮点字面量默认是double类型, 加上F可以声明为float类型
  • 字符串字面量: 即代码中双引号(串)和单引号(字符)对象. 它们被解释成常量字符数组, 程序加载时载入常量区, 可以寻址.
  • 初始化: 初始化发生在对象创建时, 可以使用变量、常量或字面量初始化. 后面还可以用表达式的返回值、函数的返回值进行初始化。
    • 一般语法: Type objName = val
    • 结构类型的语法: … = {val1, val2, …} 数组需要所有值的类型相同
  • 对象命名: 指定命名规范能够提升开发效率, 对后期维护和修改都是有重大意义的. 根据自己的特点选择合适的命名规范. 当下的命名规范主要有三种
    • 匈牙利命名法: 全局变量用 g_ 修饰; 常量用 c_ 修饰; 成员变量用 m_ 修饰静态变量用 s_ 修饰, 常用于变量名和常量名, 标识其属性
      • e.g.
    • 小驼峰法: 首单词首字母小写, 其他字母首字母都大写. 通常包含类型和描述至少两个单词, 常用于变量名、函数名
      • e.g.
    • 大驼峰法: 每个单词首字母都大写. 通常包含类型和描述至少两个单词, 常用于类名、结构体名和命名空间
      • e.g.
    • 系统编码风格: 为了避免与用户变量的冲突, 系统内部的变量名都是类似 _xxx的形式给出的.
      • e.g.

  • 常量指针与指针常量: 前者属于指向常量的指针, 后者说明指针是常量 - e.g. 常量指针const int* p; 指针常量int* const p - | | 变量(非常量左值) | const变量(常量左值) | | —- | —- | —- | | 变量指针| 可以 | 强制类型转换后可以 | | 常量指针| 可以 | 可以 |

  • 数组名:

    • 数组名作为右值: 表示数组首元素指针常量 . 大部分情况都是作为右值, 一些书直接将数组名叫做数组首元素指针常量.例如 int a[2]; int * p = a;
    • 数组名作为左值: 表示数组变量, 它代表的就是整个数组那段内存空间.常见场合: 在typeid(C++中), sizeof , &取址时. 例如: int a[2]; int (*p)[2] = &a
  • 函数名:

    • 函数名作为右值: 表示函数指针常量. 大部分情况都是作为右值, 所以一些书上直接将函数名叫做函数指针常量.
      • e.g. void (*p)(void) = Function;
    • 函数名作为左值: 表示函数变量, 它代表的是存储代码的那片内存区域. 常见场合: typeid , &取址, 函数调用时(这个是最常见的);
      • e.g. void (*p)(void) = &Function;

非常量左值引用引常量左值破坏了量的不可修改性 非常量左值是左值引用, 理论上不可引右值

  int a = 1;
const int b = a;//此时的b为一个常量左值
/*int &c = b*/  //error, 非常量左值引用必须由非常量左值进行初始化
const int c = *(int*)&b //等式的右边是一个非常量左值引用, 注意(int)b是不正确的, 因为强制类型转换得到的是右值