一些常见指针

在 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 <memory>
std::unique_ptr<int> 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 的,不能修改其值,即不能将其指向另一个对象。
 

  • 7
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
指针和结构体是 C 语言中非常基础和常见的概念,以下是一些常见问题: 1. 什么是指针指针是一种用于存储地址的变量类型,它可以指向另一个变量或对象的内存地址,通过指针可以访问或修改该变量或对象。在 C 语言中,使用 `*` 运算符来定义一个指针变量,并使用 `&` 运算符来获取一个变量的地址。 2. 什么是结构体? 结构体是一种自定义的复合数据类型,它可以包含多个不同类型的成员变量,每个成员变量可以有自己的类型和名称。在 C 语言中,使用 `struct` 关键字来定义一个结构体类型,并使用 `.` 运算符来访问结构体的成员变量。 3. 如何定义一个指向结构体的指针? 定义一个指向结构体的指针需要先定义一个结构体类型,然后使用 `*` 运算符来声明一个指向该结构体类型的指针变量。例如,定义一个指向名为 `Person` 的结构体类型的指针变量可以写为: ```c struct Person { char name[20]; int age; }; struct Person *p; ``` 4. 如何访问结构体指针的成员变量? 访问结构体指针的成员变量需要使用 `->` 运算符,它相当于 `(*p).name` 的简写形式,其中 `p` 是指向结构体的指针变量。例如,要访问名为 `name` 的成员变量可以写为 `p->name`。 5. 如何将结构体指针传递给函数? 将结构体指针传递给函数需要使用指针参数,即在函数定义时使用 `*` 运算符来声明一个指向结构体的指针参数,然后在函数调用时将结构体指针变量作为参数传递。例如: ```c void printPerson(struct Person *p) { printf("Name: %s, Age: %d\n", p->name, p->age); } // 在主函数中调用 printPerson 函数,将结构体指针变量作为参数传递 struct Person p1 = {"Alice", 20}; printPerson(&p1); ``` 6. 如何动态分配结构体指针内存? 动态分配结构体指针内存需要使用 `malloc` 函数,它可以在堆上分配一块指定大小的内存,并返回一个指向该内存块的指针。例如,要动态分配一个名为 `Person` 的结构体指针可以写为: ```c struct Person *p = (struct Person *) malloc(sizeof(struct Person)); ``` 分配内存后,可以使用 `->` 运算符访问结构体的成员变量,并使用 `free` 函数释放内存。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值