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;
};