背景简介
- 本章内容主要围绕C和C++中的内存管理及流操作技术,涵盖了从基础到进阶的知识点。
如何在C和C++中打印指针地址?
使用cout和printf打印指针地址
- 在C++中,我们可以利用
cout
配合类型转换 (void*)
来打印指针的地址。 - 使用
printf
函数的 %p
格式化占位符同样可以实现此功能。
char* amount = "dozen";
cout << (void*) amount; // prints the address of pointer
printf("%p", (void*) amount);
格式化输出
- 格式化输出是输出的关键,了解控制输出格式的常见操作符非常重要。这包括数制操作符(如
hex
, oct
, dec
)和字段宽度控制(如 width
, fill
, precision
)。 - 为了更好地掌握格式化输出,建议包含头文件
<iomanip>
。
#include <iomanip>
// ...
cout << std::hex << amount << std::endl; // print amount in hexadecimal
cout的其他用法
-
<<
运算符在C++中被重载为输出操作符,属于 ostream
类。 -
cout<<flush
用于强制刷新输出缓冲区。 -
cout.write
能够输出字符串,即使达到字符串末尾。
char str[] = "Hello, World!";
cout.write(str, 5); // 输出Hello
文件操作
文件读写
- 使用
ifstream
、 ofstream
或 fstream
对象进行文件操作,与标准输入输出流 cin
和 cout
类似。 - 示例代码展示了如何打开、读取和关闭文件。
std::fstream ifs;
ifs.open("test.txt", ios_base::in | ios_base::binary);
if (!ifs.is_open())
exit(1);
char c = ifs.get();
// ...
ifs.close();
内存管理
内存可用性与管理
- C++程序运行时,操作系统为程序分配内存,包括代码段、数据段、堆和栈。
- 程序员需要注意栈溢出和堆内存的动态分配与回收。
手动内存管理
-
new
和 delete
是手动内存管理的关键操作符,需要谨慎使用。 - 避免内存泄漏和重复释放同一块内存。
int* x = new int[10];
// ...
delete[] x; // Free up memory allocated by new
资源管理
- 确保在不再需要时释放资源,比如使用智能指针来自动管理内存。
- 示例代码说明了如何忘记调用清除函数导致的潜在问题。
void x() {
IntList1 my_list;
// ...
} // my_list goes out of scope, destructor should be called
总结与启发
- 掌握C/C++中的内存管理和流操作对于编写高效、稳定的程序至关重要。
- 通过本文的介绍,我们了解了如何打印指针地址,进行格式化输出,并进行文件读写操作。
- 内存管理部分让我们认识到手动管理内存的复杂性,以及合理使用资源的重要性。
- 随着C++11及后续版本中智能指针和资源获取即初始化(RAII)模式的引入,现代C++程序员在内存管理上拥有了更多的工具和最佳实践。
- 对于初学者来说,理解并实践这些概念是一个逐步的过程,需要结合实际编程经验不断深化理解。
- 未来可以考虑探讨C++11及之后版本中智能指针的使用,以及现代C++的内存管理最佳实践。