跳转到内容

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++指针的无缝交互。
  • 始终注意指针安全性(空指针、野指针、内存泄漏)。

参见[编辑 | 编辑源代码]