C++ 与 C 指针
外观
C++与C指针
介绍[编辑 | 编辑源代码]
在C++和C的交互中,指针是一个核心概念。由于C++是C的超集,它继承了C的指针机制,并在此基础上扩展了更安全的智能指针等功能。理解C++与C指针的交互对于编写兼容性代码、调用C库或优化性能至关重要。本页将详细介绍C++和C指针的基本概念、差异、交互方式以及实际应用。
C指针基础[编辑 | 编辑源代码]
C语言中的指针是一个变量,其值为另一个变量的内存地址。指针的基本操作包括声明、初始化和解引用。
指针声明与初始化[编辑 | 编辑源代码]
在C中,指针的声明语法如下:
int *ptr; // 声明一个指向int的指针
指针可以通过取地址运算符(&
)初始化:
int num = 10;
int *ptr = # // ptr现在指向num的地址
解引用指针[编辑 | 编辑源代码]
解引用指针(使用*
运算符)可以访问或修改指针指向的值:
int value = *ptr; // value现在等于10
*ptr = 20; // 修改num的值为20
C++指针扩展[编辑 | 编辑源代码]
C++保留了C指针的所有功能,同时引入了更安全的替代方案(如引用和智能指针)。然而,在与C代码交互时,原始指针仍然是必要的。
C++中的原始指针[编辑 | 编辑源代码]
C++的原始指针语法与C完全一致:
int num = 42;
int *ptr = #
std::cout << *ptr; // 输出42
C++引用与指针的区别[编辑 | 编辑源代码]
C++引入了引用(&
),它是变量的别名,语法更简洁:
int num = 42;
int &ref = num; // ref是num的引用
ref = 100; // 修改num的值
引用与指针的区别:
- 引用必须初始化且不能重新绑定。
- 引用没有空值(null),而指针可以为
nullptr
。
C++与C指针交互[编辑 | 编辑源代码]
由于C++和C的ABI(应用二进制接口)兼容,它们的指针可以互相传递。以下是常见的交互场景:
在C++中调用C函数[编辑 | 编辑源代码]
假设有一个C库函数:
// myclib.h
#ifdef __cplusplus
extern "C" {
#endif
void modify_int(int *ptr);
#ifdef __cplusplus
}
#endif
在C++中调用:
#include "myclib.h"
int main() {
int value = 5;
modify_int(&value); // 传递指针给C函数
return 0;
}
在C中调用C++函数[编辑 | 编辑源代码]
C++函数可以通过extern "C"
导出为C兼容接口:
// mycpplib.h
#ifdef __cplusplus
extern "C" {
#endif
void cpp_function(int *ptr);
#ifdef __cplusplus
}
#endif
实现:
#include "mycpplib.h"
#include <iostream>
void cpp_function(int *ptr) {
*ptr *= 2; // 修改指针指向的值
}
在C中调用:
#include "mycpplib.h"
int main() {
int num = 10;
cpp_function(&num); // 调用C++函数
return 0;
}
指针安全性与常见问题[编辑 | 编辑源代码]
空指针与野指针[编辑 | 编辑源代码]
- 空指针:未初始化的指针或显式设置为
nullptr
(C++11)/NULL
。 - 野指针:指向已释放内存的指针。
示例:
int *ptr = nullptr; // 安全的空指针
int *wild_ptr; // 未初始化,危险!
内存泄漏[编辑 | 编辑源代码]
在C++中,动态分配的内存必须手动释放:
int *ptr = new int(10);
delete ptr; // 必须释放
实际案例:C/C++混合项目[编辑 | 编辑源代码]
假设有一个项目,C部分处理硬件接口,C++部分实现业务逻辑:
C头文件(硬件接口)[编辑 | 编辑源代码]
// hardware.h
#ifdef __cplusplus
extern "C" {
#endif
void read_sensor(int *value);
#ifdef __cplusplus
}
#endif
C++业务逻辑[编辑 | 编辑源代码]
#include "hardware.h"
#include <iostream>
class SensorReader {
public:
void update() {
int sensor_value;
read_sensor(&sensor_value); // 调用C函数
std::cout << "Sensor value: " << sensor_value << std::endl;
}
};
总结[编辑 | 编辑源代码]
- C++完全兼容C指针,但推荐使用更安全的替代方案(如引用、智能指针)。
- 通过
extern "C"
可以实现C/C++指针的无缝交互。 - 始终注意指针安全性(空指针、野指针、内存泄漏)。