您的位置:

C++取地址运算符:&的使用方法

一、基础概念

&是一种一元运算符,用于得到一个对象的内存地址。在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;
}

C++14中引入了一个新特性,即使用&运算符来获取数组的地址,因此在C++14及以后的版本中,可以直接使用&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来获取数组的地址,并使用指针来访问和修改数组元素的值。结构体和类也可以使用指针来访问和修改它们的成员变量。