一、基础概念
&
是一种一元运算符,用于得到一个对象的内存地址。在 C 和 C++ 中,变量都有一个唯一的地址,其中包含变量的值和类型信息。&
运算符返回的值是一个指向该地址的指针。
int a = 10;
int* p = &a; // 将指针 p 指向 a 的地址
可以使用 sizeof
操作符来获取一个变量占用的内存大小,可以使用 &
运算符和指针来修改或访问一个变量的值。
二、指针与引用
在 C++ 中,使用指针和引用都可以访问和修改变量的值。
指针是一个指向其他对象的对象,它可以被赋值为另一个指针或者 NULL
,也可以通过指针访问或者修改它所指向的对象。使用指针需要注意空指针的问题。
int a = 10;
int* p = &a;
int* q = nullptr;
if(p != nullptr){
*p = 20;
}
if(q == nullptr){
std::cout << "q is a null pointer." << std::endl;
}
引用是一个对象的别名,它可以被赋值为另一个引用或对象,也可以通过引用访问或者修改它所指向的对象。引用在定义时必须进行初始化,且引用在初始化后不能再改变其值。使用引用需要注意避免空引用和野指针。
int a = 10;
int& r = a;
r = 20;
std::cout << a << std::endl; // 输出 20
三、函数参数中的 &
在函数参数中使用 &
时,表示该参数是一个引用类型,它可以直接修改函数外部的变量的值。
void addOne(int& n){
n += 1;
}
int a = 10;
addOne(a);
std::cout << a << std::endl; // 输出 11
当在函数参数中使用 const
关键字与 &
符号一起使用时,表示该参数是一个常量引用,它可以参与到函数的计算过程中,但是不能被改变。
void print(const int& n){
std::cout << n << std::endl;
}
int a = 10;
print(a);
const int b = 20;
print(b);
四、数组与指针
指针可以用来存储数组的地址,也可以通过指针来访问和修改数组元素的值。
int a[5] = {1, 2, 3, 4, 5};
int* p = a;
for(int i = 0; i < 5; i++){
std::cout << *(p + i) << std::endl;
}
C14 中引入了一个新特性,即使用 &
运算符来获取数组的地址,因此在 C14 及以后的版本中,可以直接使用 &a
来获取数组的地址。
int a[5] = {1, 2, 3, 4, 5};
int* p = a; // 等价于 int* p = &a[0];
for(int i = 0; i < 5; i++){
std::cout << *(p + i) << std::endl;
}
五、结构体与类
结构体和类是 C++ 中自定义类型的两种方式,也可以使用指针来访问和修改它们的成员变量。
struct Student{
std::string name;
int age;
};
Student s = {"Tom", 20};
Student* p = &s;
p->name = "Jerry";
p->age = 21;
std::cout << s.name << ", " << s.age << std::endl; // 输出 Jerry, 21
六、总结
&
运算符可以用于获取一个对象的内存地址,包括基本类型、数组、结构体和类等自定义类型。在 C++ 中,指针和引用都可以用来修改变量的值,但是需要注意空指针、空引用和野指针的问题。在函数参数中使用 &
时,可以直接修改函数外部的变量的值。在访问数组时,可以使用 &a
来获取数组的地址,并使用指针来访问和修改数组元素的值。结构体和类也可以使用指针来访问和修改它们的成员变量。