C++ 引用和指针
创建引用
引用变量是对现有变量的“别名”,它是使用 &
运算符创建的:
string food = "Pizza"; // 食物变量 string &meal = food; // 对 food 的引用
现在,我们可以使用变量名 food
或引用名 meal
来引用食物变量:
cout << food << "\n"; // 输出 Pizza cout << meal << "\n"; // 输出 Pizza
C++ 内存地址
内存地址
在前一页的示例中,使用 &
运算符创建了一个引用变量。但它也可以用于获取变量的内存地址;即变量在计算机上存储的位置。
当在 C++ 中创建一个变量时,会为该变量分配一个内存地址。当我们给变量赋值时,它将存储在这个内存地址中。
要访问它,使用 &
运算符,结果将表示变量存储的位置:
string food = "Pizza"; cout << &food; // 输出 0x6dfed4
注意:内存地址以十六进制形式表示(0x..)。注意你可能在你的程序中得不到相同的结果。
为什么知道内存地址很有用呢?
引用和指针在 C++ 中非常重要,因为它们使你能够操作计算机内存中的数据 - 这可以减少代码并提高性能。
这两个特性是使 C++ 与其他编程语言(如 Python 和 Java)不同的因素之一。
C++ 指针
创建指针
可以使用 &
运算符获取变量的内存地址:
string food = "Pizza"; // 类型为 string 的食物变量 cout << food; // 输出 food 的值(Pizza) cout << &food; // 输出 food 的内存地址(0x6dfed4)
然而,指针是一种将内存地址作为其值的变量。
指针变量指向相同类型的数据类型(如 int
或 string
),并使用 *
运算符创建。将正在处理的变量的地址分配给指针:
string food = "Pizza"; // 类型为 string 的食物变量 string* ptr = &food; // 指针变量,名为 ptr,存储 food 的地址 // 输出 food 的值(Pizza) cout << food << "\n"; // 输出 food 的内存地址(0x6dfed4) cout << &food << "\n"; // 使用指针输出 food 的内存地址(0x6dfed4) cout << ptr << "\n";
示例解释
- 使用星号
*
(string* ptr
)创建一个名为ptr
的指针变量,它指向一个字符串变量。注意指针的类型必须与你正在处理的变量的类型匹配。 - 使用
&
运算符存储名为food
的变量的内存地址,并将其分配给指针。 - 现在,
ptr
持有food
的内存地址的值。
提示:声明指针变量有三种方式,但第一种方式是首选的:
string* mystring; // 首选 string *mystring; string * mystring;
引用和指针的区别
特性 | 引用 | 指针 |
初始化 | 必须初始化 | 可以不初始化 |
可空 | 不允许空引用 | 允许空指针 |
可变性 | 一旦初始化就不能改变引用指向的变量 | 可以改变指针指向的变量 |
解引用 | 不需要解引用 | 需要解引用 |
效率 | 通常比指针更有效率 | 通常比引用效率低 |
什么时候使用引用和指针
- 使用引用:
- 函数参数传递:引用可以传递给函数,函数可以直接修改引用指向的变量,而无需创建副本。
- 提高效率:引用比指针更有效率,因为不需要指针的解引用操作。
- 使用指针:
- 动态内存分配:指针用于动态分配和释放内存。
- 复杂数据结构:指针用于访问和操作复杂数据结构,例如链表和树。
总而言之,引用和指针都是 C++ 中强大的工具,可以用于高效地操作内存和数据。选择使用引用还是指针取决于具体情况。