一、基础概念
&是一种一元运算符,用于得到一个对象的内存地址。在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来获取数组的地址,并使用指针来访问和修改数组元素的值。结构体和类也可以使用指针来访问和修改它们的成员变量。