指针是一个变量,它存储了内存中某个值的地址。声明一个指针需要在其类型后加上一个星号(*)。正确地声明和初始化指针是使用指针时避免错误和未定义行为的关键。
1、指针的声明:
可以声明一个类型指定的指针,它指向该类型的值。
指向基础数据类型的指针
int* pInt;
double* pDouble;
char* ptrToChar;
指向数组的指针
int arr[10];
int (*ptrToArray)[10] = &arr;
指向指针的指针(多级指针)
int** ptrToPtrToInt;
指向函数的指针
void (*ptrToFunc)(int);
int add(int a, int b) {
return a + b;
}
auto functionPtr = add;
typedef int (*AddFuncPtr)(int, int);
using AddFuncPtr = int (*)(int, int);
AddFuncPtr functionPtr = add;
int result = functionPtr(3, 4);
指向对象或类成员的指针
class MyClass {
public:
void memberFunc();
};
MyClass* ptrToObject;
void (MyClass::*ptrToMemberFunc)() = &MyClass::memberFunc;
使用 auto 声明指针
在 C++11 及更高版本中,可以使用 auto 关键字自动推导变量的类型
int value = 5;
auto* ptr = &value;
或者可以省略星号,直接用 auto
auto ptr = &value;
指针声明的语法注意事项
指针类型和变量名称之间的星号 (*) 可以紧靠类型,也可以紧靠变量名,甚至有人喜欢放在它们中间,但推荐的做法是紧挨着类型,这样更清楚地表示了类型
int* ptr;
int *ptr2;
int * ptr3;
如果声明多个指针,需要在每个指针变量前加星号;
只在类型前加一个星号,则只有第一个变量是指针。
int* ptr1, * ptr2;
int* ptr1, ptr2;
const 修饰符与指针
在涉及指针的声明中,const 可以用来修饰指针所指向的数据类型,指针本身,或者两者都修饰。
const int* ptr1;
int const* ptr2;
int* const ptr3;
const int* const ptr4;
声明指针时,务必小心,确保明确了指针的意图和使用方式,这是写出清晰、可读和安全代码的基础。