一些常见指针

在 C 和 C++ 编程语言中,指针是一个非常重要和强大的概念。指针是一个变量,它存储了另一个变量的内存地址。通过指针,可以间接访问和修改内存中的数据。以下是一些常见的指针类型和使用场景:
1. **普通指针**:这是最基本的指针类型,用于指向特定类型的数据。例如,一个 `int` 类型的指针会存储一个 `int` 类型变量的内存地址。
```cpp
int var = 5;
int *ptr = &var; // ptr 是一个指向 var 的指针
```
2. **空指针**:一个没有指向任何有效内存地址的指针。在 C++ 中,建议使用 `nullptr` 来初始化空指针。
```cpp
int *ptr = nullptr; // ptr 是一个空指针
```
3. **野指针**:一个未初始化的指针,它可能指向任意的内存地址。使用野指针可能会导致不可预测的行为,应该避免。
4. **指针算术**:指针可以进行加减运算,但这通常与它指向的数据类型的大小有关。例如,一个 `int` 类型的指针加上 1,实际上会增加 `sizeof(int)` 字节。
```cpp
int arr[5] = {1, 2, 3, 4, 5};
int *ptr = arr; // ptr 指向数组的首元素
++ptr; // ptr 现在指向 arr[1]
```
5. **函数指针**:指向函数的指针,可以用来调用函数或作为函数参数传递。
```cpp
void func() {
    // ...
}
void (*funcPtr)() = &func; // funcPtr 是一个指向 func 的函数指针
funcPtr(); // 调用 func 函数
```
6. **数组指针**:指向数组的指针,可以用来访问数组元素。
```cpp
int arr[5] = {1, 2, 3, 4, 5};
int (*ptr)[5] = &arr; // ptr 是一个指向数组的指针
```
7. **指针数组**:一个数组,其元素是指针。
```cpp
int var1 = 1, var2 = 2;
int *ptrArr[2] = {&var1, &var2}; // ptrArr 是一个包含两个指针的数组
```
8. **多级指针**:指向指针的指针。在 C 和 C++ 中,可以有任意级别的指针,但超过两级(**指针的指针**)通常会使代码难以理解。
```cpp
int var = 5;
int *ptr = &var;
int **pptr = &ptr; // pptr 是一个指向 ptr 的指针
```
9. **智能指针**(C++ 特有):在 C++ 中,智能指针是一类特殊的指针,它可以自动管理内存,减少内存泄漏的风险。例如,`std::unique_ptr` 和 `std::shared_ptr`。
```cpp
#include
std::unique_ptr uptr(new int(5)); // uptr 是一个智能指针,指向一个 int 类型的对象

 

 在 C++ 中,`this` 指针是一个特殊的指针,它自动存在于类的每个非静态成员函数中。`this` 指针指向调用该成员函数的对象的地址。使用 `this` 指针,可以在成员函数中引用调用对象的成员变量和成员函数。
以下是一些 `this` 指针的常见用法:
1. **引用成员变量**:在类的成员函数中,可以使用 `this` 指针来引用调用对象的成员变量。
```cpp
class MyClass {
public:
    int value;
    void setValue(int val) {
        this->value = val; // 使用 this 指针引用成员变量 value
    }
};
```
2. **返回对象本身**:`this` 指针可以用于返回调用对象本身,这在链式调用中非常有用。
```cpp
class MyClass {
public:
    MyClass& increment(int val) {
        this->value += val;
        return *this; // 返回调用对象本身
    }
    int value;
};
MyClass obj;
obj.increment(2).increment(3); // 链式调用
```
3. **传递当前对象**:可以将 `this` 指针作为参数传递给其他函数,以便在函数中操作当前对象。
```cpp
class MyClass {
public:
    void print() {
        printThis(this); // 将 this 指针传递给函数
    }
private:
    static void printThis(MyClass *ptr) {
        std::cout << ptr->value << std::endl;
    }
    int value;
};
```
4. **比较两个对象的地址**:可以使用 `this` 指针来比较两个对象的地址。
```cpp
class MyClass {
public:
    bool isEqual(MyClass &other) {
        return this == &other; // 比较 this 指针和 other 对象的地址
    }
};
```
需要注意的是,`this` 指针在静态成员函数中不可用,因为静态成员函数不与任何对象实例相关联。此外,`this` 指针是 const 的,不能修改其值,即不能将其指向另一个对象。
 

你可能感兴趣的:(c++)