文章目录
article
基础概念
AI文章摘要
qwen-turbo-latest
加载中...
数据类型
- 原子类型: 是编译器可以操作的最基本数据类型
char
: 字符型1Ushort
, 短整型2Uint
: 整形4Ulong
: 长整型4U (注意long类型仍然是4U, long long才是8字节)float
: 单精度浮点型4Udouble
: 双精度浮点型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.
- 匈牙利命名法: 全局变量用 g_ 修饰; 常量用 c_ 修饰; 成员变量用 m_ 修饰静态变量用 s_ 修饰, 常用于变量名和常量名, 标识其属性
常量指针与指针常量: 前者属于指向常量的指针, 后者说明指针是常量 - 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是不正确的, 因为强制类型转换得到的是右值