1. 数组的声明和使用

(1)数组名的含义

数组名是地址常量

(2)调用规则

a. 数组必须先声明后调用

b. 只能逐个访问 不能整体调用

(3)数组名作参数

数组名作参数,形参被转换为指针,实参也是数组名

(4)对象数组

声明:类名 数组名[元素个数]访问:数组名[下标].成员名注意:只能引用单个数组元素,每个数组都是一个对象,初始化过程即调用构造函数对每个元素进行初始化

2. 指针与指针变量

(1)指针与指针变量的定义

指针:一个变量的地址指针变量:专门存放变量地址的变量,具有一定作用域的特征

(2)*与&

&:若int a,&a表示存储a空间的地址*:若int *p,p表示int刑指针

3. 静态指针变量

(1)定义

以static关键字修饰的指针变量

(2)存储特性

a. 静态存储期

在整个程序运行期间都存在,内存空间在程序开始时就被分配,直到程序结束才被释放。而自动指针变量在其所在的代码块执行结束后就会被销毁

b. 默认初始化为NULL

若在定义静态指针变量时未显式初始化,则会被自动初始化为NULL,有助于避免野指针问题

(3)作用域

a. 文件作用域

在函数外部定义的静态指针变量具有文件作用域,其可见性仅限于定义它的源文件,在其他源文件中无法直接访问该变量,可有效防止变量名冲突

b. 局部作用域

在函数内部定义的静态指针变量具有局部作用域,但其生命周期贯穿整个程序运行中间

4. 指针的赋值

(1)指针名=地址

如&p=a,则p=*a

(2)赋值原则

向指针赋的值必须是地址常量或变量,不能是普通整数。但可以赋值为0,表示空指针

(3)void指针

允许声明指向void类型指针,该指针可以被赋予任何类型对象的地址

(4)常指针

指向常量的指针,可以改变指向的对象,但不能通过指针修改指向对象的值

const int *p=a;

(5)指针常量

不能改变指针指向的对象

int *const p=&a;

5. 指针运算

(1)指针与整数的加减运算

指针加减n,指加减n个步长,具体由其存储的数据类型决定

(2)运算符优先级细节

        int a[2] = { 1,5 };
        int *p =&a[0];
        std::cout << (*p++)<<" "<<a[0]<<" "<<a[1];

*与++优先级相同 *p++ 先解引用再将指针后移一位++*p先解引用p再将值+1*(++p)先将指针后移一位再解引用

(3)指针之间的运算

p1-p2--两个指针必须类型相同,结果为整数(p1与p2之间相隔的元素个数),他们通常指向同一个数组空间

(4)关系运算

一般是同类型指针之间的运算,也可以与NULL之间做关系运算

6. 用指针作为函数参数

(1)传入地址数据

传入地址数据可以返回函数处理结果

(2)实参是数组名

实参是数组名形参可以是指针或数组名

(3)形参是数组名

形参是数组名编译器自动转化为对应的指针类型

7. 函数指针

存放函数首地址的变量重要应用:回调函数

  • 回调函数
#include <iostream>
//   定义回调函数类型
typedef void (*CallbackFunctionType)(int);
//   实现回调函数
void myCallbackFunction(int value)
{
     std::cout << "Callback function called with value: " << value << std::endl;
}
//   需要回调函数的函数
void registerAndCallCallback(CallbackFunctionType callback, int value)
{
     //   调用回调函数
     callback(value);
}
int main()
{
     //   注册回调函数
     registerAndCallCallback(myCallbackFunction, 42);
     return 0;
}

在这个例子中,我们首先定义了一个名为 CallbackFunctionType 的函数指针类型,它指向一个接受 int 参数并返回 void 的函数。然后,我们实现了一个名为 myCallbackFunction 的回调函数,它符合这个签名。在 main 函数中,我们将 myCallbackFunction 的地址作为参数传递给registerAndCallCallback 函数,后者随后调用了这个回调函数。

注意事项

  • 类型安全:确保回调函数和函数指针的类型完全匹配是非常重要的,否则会导致未定义行为。
  • 内存管理:如果回调函数或函数指针涉及到动态内存分配,需要小心管理内存,以避免内存泄漏或

野指针问题。

8. this指针

(1)定义

隐含于类的对象内部的特殊指针

(2)调用

当通过一个对象调用成员函数时,系统先将对象的地址赋值给this指针,然后调用成员函数,成员函数对对象的数据成员进行操作时,就隐含使用了this指针

(3)必须使用this的情况

a. 成员变量和局部变量同名

b. 返回当前对象的引用或指针

在需要返回当前对象本身(或其引用/指针)的场合, this 指针非常有用。这通常用于实现链式调用。例如

class MyClass {
public:
     MyClass& add(int value) {
          // 假设有一个成员变量用于累加
          // 返回当前对象的引用,支持链式调用
          return *this;
     }
};

MyClass obj;
obj.add(10).add(20); //   链式调用

c. 作为参数传递给其他成员函数

在类的某个成员函数中,需要将当前对象(或部分成员变量)传递给其他成员函数时,可以使用this 指针作为参数传递。

class Demo {
public:
     void func1() {
         this->func2(this->value);
     }
     void func2(int num) {
         // do something with num
     }
private:
     int value;
};