--- 卷王之卷,我愿称之为HKU第一卷!
C++指针
- 每一个变量都有一个内存位置,每一个内存位置都定义了可使用连字号(&)运算符访问的地址,它表示了在内存中的一个地址
- 指针是一个变量,其值为另一个变量的地址
- 所有指针的值的实际数据类型,不管是整型、浮点型、字符型,还是其他的数据类型,都是一样的,都是一个代表内存地址的长的十六进制数
- 在变量声明的时候,如果没有确切的地址可以赋值,为指针变量赋一个 NULL 值是一个良好的编程习惯。赋为 NULL 值的指针被称为空指针
- NULL 指针是一个定义在标准库中的值为零的常量
- 在大多数的操作系统上,程序不允许访问地址为 0 的内存,因为该内存是操作系统保留的
- 内存地址 0 有特别重要的意义,它表明该指针不指向一个可访问的内存位置
- 未初始化的变量存有一些垃圾值,导致程序难以调试
- 在程序中使用指针代替数组,因为变量指针可以递增,而数组不能递增,因为数组是一个常量指针
- 指针可以用关系运算符进行比较
- 修改 var 的值是非法的。这是因为 var 是一个指向数组开头的常量,不能作为左值
- 把 ptr 声明为一个数组,由 MAX 个整数指针组成。因此,ptr 中的每个元素,都是一个指向 int 值的指针
int *ptr[MAX];
- 指向指针的指针(多级间接寻址)
- 能接受指针作为参数的函数,也能接受数组作为参数
- C++ 不支持在函数外返回局部变量的地址,除非定义局部变量为 static 变量
C++ 引用
- 不存在空引用,引用必须连接到一块合法的内存,引用必须在创建时被初始化
- 一旦引用被初始化为一个对象,就不能被指向到另一个对象,指针可以在任何时候指向到另一个对象
-
void swap(int& x, int& y)
通过引用调用函数 - double& setValues( int i ) 返回引用
- 被引用的对象不能超出作用域,返回一个对局部变量的引用是不合法的,但是,可以返回一个对静态变量的引用
C++ 日期 & 时间
- C++ 标准库没有提供所谓的日期类型,继承了 C 语言用于日期和时间操作的结构和函数
- 为了使用日期和时间相关的函数和结构,需要引用 <ctime> 头文件
- 四个与时间相关的类型:clock_t、time_t、size_t 和 tm
- clock_t、size_t 和 time_t 能够把系统时间和日期表示为某种整数
time函数
-
time_t time(time_t *seconds)
返回自纪元 Epoch(1970-01-01 00:00:00 UTC)起经过的时间,以秒为单位 - 如果 seconds 不为空,则返回值也存储在变量 seconds 中
- time.h是早期的头文件, 在C++标准之前就有了, ctime是C++标准的头文件, 两个一般是同一个文件
-
char *ctime(const time_t *timer)
返回一个表示当地时间的字符串
time_t curtime;
time(&curtime);
cout<<ctime(&curtime);
struct tm *localtime(const time_t *timer)
-
clock_t clock(void)
返回程序执行起(一般为程序的开头),处理器时钟所使用的时间 - 为了获取 CPU 所使用的秒数,您需要除以 CLOCKS_PER_SEC
- 在 32 位系统中,CLOCKS_PER_SEC 等于 1000000,该函数大约每 72 分钟会返回相同的值
clock_t st = clock();
...
clock_t ed = clock();
cout<<(double)(ed-st)/CLOCKS_PER_SEC;
-
char *asctime(const struct tm *timeptr)
timeptr 是指向 tm 结构的指针 -
struct tm *gmtime(const time_t *timer)
格林尼治标准时间 -
time_t mktime(struct tm *timeptr)
把 timeptr 所指向的结构转换为一个依据本地时区的 time_t 值
timeinfo = localtime(&rawtime);
timeinfo->tm_year -= 1900;
timeinfo->tm_mon -= 1;
timeinfo->tm_mday = day;
mktime(timeinfo);
cout<<timeinfo->tm_wday;
double difftime(time_t time1, time_t time2)
-
size_t strftime(char *str, size_t maxsize, const char *format, const struct tm *timeptr)
根据 format 中定义的格式化规则,格式化结构 timeptr 表示的时间,并把它存储在 str 中 strftime(buffer, 80, "%Y-%m-%d %H:%M:%S", info);
C++ 基本的输入输出
- C++ 的 I/O 发生在流中,流是字节序列。如果字节流是从设备流向内存,这叫做输入操作。如果字节流是从内存流向设备,这叫做输出操作
- <iomanip>,该文件通过所谓的参数化的流操纵器(比如 setw 和 setprecision),来声明对执行标准化 I/O 有用的服务
- <fstream>,该文件为用户控制的文件处理声明服务。我们将在文件和流的相关章节讨论它的细节
- cout 对象"连接"到标准输出设备,通常是显示屏
- C++ 编译器根据要输出变量的数据类型,选择合适的流插入运算符来显示值
- << 运算符被重载来输出内置类型(整型、浮点型、double 型、字符串和指针)的数据项
- 预定义的对象 cin 是 iostream 类的一个实例
- C++ 编译器根据要输入值的数据类型,选择合适的流提取运算符来提取值,并把它存储在给定的变量中
- 如果要求输入多个数据,可以使用如下语句:
cin >> name >> age;
,相当于cin >> name;cin >> age;
- 预定义的对象 cerr 是 iostream 类的一个实例。cerr 对象附属到标准错误设备,通常也是显示屏,但是 cerr 对象是非缓冲的,且每个流插入到 cerr 都会立即输出
- 预定义的对象 clog 是 iostream 类的一个实例。clog 对象附属到标准错误设备,通常也是显示屏,但是 clog 对象是缓冲的。这意味着每个流插入到 clog 都会先存储在缓冲区,直到缓冲填满或者缓冲区刷新时才会输出
- 使用 cerr 流来显示错误消息,而其他的日志消息则使用 clog 流来输出
C++ 数据结构
struct type_name {
member_type1 member_name1;
member_type2 member_name2;
member_type3 member_name3;
.
.
} object_names;
- 为了访问结构的成员,我们使用成员访问运算符(.)
- 可以把结构作为函数参数,
void printBook( struct Books book );
- 为了使用指向该结构的指针访问结构的成员,您必须使用 -> 运算符
- 为创建的类型取一个"别名"
typedef struct Books
{
char title[50];
char author[50];
char subject[100];
int book_id;
}Books;
- 现在,您可以直接使用 Books 来定义 Books 类型的变量,而不需要使用 struct 关键字