目录
指针和引用是C++中的两个重要概念,用于处理内存中的数据。它们都可以用来访问内存中的数据,但是它们之间有很多不同之处。
1、指针
(1)指针的定义
指针是一种变量类型,用于存储另一个变量的内存地址。它可以指向任何数据类型的变量,包括整数、浮点数、字符、数组、结构体等。指针变量本身也有一个内存地址,可以通过取地址符“&”来获取。指针变量的值可以通过解引用符“*”来访问所指向的变量的值。指针在C语言中是非常重要的概念,它可以用于动态内存分配、函数传递参数、数据结构等方面。
(2)指针示例:
int value = 10;
int* ptr = &value; // 定义指向value的指针
cout << *ptr; // 输出指针所指向的值,即10
*ptr = 20; // 修改指针所指向的值
cout << value; // 输出value的值,即20
在这个示例中,我们定义了一个int类型的变量value,并将其初始化为10。然后,我们定义了一个指向value的指针ptr,并使用取地址运算符&来获取value变量的地址。接着,我们用解引用运算符*来输出指针所指向的值,即10。最后,我们修改了指针所指向的值为20,并输出value的值,即20。
(3)指针的指针
指针的指针是指一个指针变量的地址,也就是指向指针变量的指针。在C语言中,可以通过使用双重指针(即指向指针的指针)来实现动态内存分配和传递指针数组等操作。
以下是一个指针的指针的示例:
#include <stdio.h>
int main() {
int x = 10;
int *ptr1 = &x;
int **ptr2 = &ptr1;
printf("Value of x: %d\n", x);
printf("Value of ptr1: %p\n", ptr1);
printf("Value of ptr2: %p\n", ptr2);
printf("Value of *ptr1: %d\n", *ptr1);
printf("Value of **ptr2: %d\n", **ptr2);
**ptr2 = 20;
printf("Value of x: %d\n", x);
printf("Value of ptr1: %p\n", ptr1);
printf("Value of ptr2: %p\n", ptr2);
printf("Value of *ptr1: %d\n", *ptr1);
printf("Value of **ptr2: %d\n", **ptr2);
return 0;
}
这个程序定义了一个整数变量x,一个指向x的指针ptr1和一个指向ptr1的指针ptr2。我们可以使用ptr1来访问x的值,使用ptr2来访问ptr1的值,使用**ptr2来访问x的值。
在程序的第一个输出语句中,我们打印了x、ptr1和ptr2的值,以及ptr1和ptr2的值。接下来,我们将ptr2的值设置为20,这将更新x的值。在程序的第二个输出语句中,我们再次打印了x、ptr1和ptr2的值,以及ptr1和**ptr2的值,以验证x的值是否已更新。
输出结果如下:
Value of x: 10
Value of ptr1: 0x7fff5fbff72c
Value of ptr2: 0x7fff5fbff720
Value of *ptr1: 10
Value of **ptr2: 10
Value of x: 20
Value of ptr1: 0x7fff5fbff72c
Value of ptr2: 0x7fff5fbff720
Value of *ptr1: 20
Value of **ptr2: 20
2、引用
(1)引用的定义:
C++引用是一个别名,它是在声明时用&符号定义的。引用可以看作是一个变量的别名,即通过引用来访问这个变量,引用本身并不占用内存空间。引用变量必须在定义时进行初始化,一旦初始化后,就不能再改变其指向的变量。引用在函数参数传递、函数返回值等方面有广泛的应用。
(2)引用示例:
int value = 10;
int& ref = value; // 定义value的引用
cout << ref; // 输出引用所引用的值,即10
ref = 20; // 修改引用所引用的值
cout << value; // 输出value的值,即20
在这个示例中,我们定义了一个int类型的变量value,并将其初始化为10。然后,我们定义了一个value的引用ref,并使用&符号将其定义为value的别名。接着,我们用引用来输出value的值,即10。最后,我们修改了引用所引用的值为20,并输出value的值,即20。
3、指针与引用的区别
(1)定义方式不同
指针是一个变量,用于存储另一个变量的地址,其定义方式为在变量名前加上“*”符号,例如:int *p;
引用是一个别名,用于给已经存在的变量起一个新的名称,其定义方式为在变量名前加上“&”符号,例如:int &r = a;
(2)作用不同
指针可以用于修改变量的值,也可以用于动态分配内存。
引用主要用于简化代码,避免使用指针时需要频繁解引用,同时也可以用于传递函数参数,使得函数调用更加高效。
(3)空指针和野指针
指针可以指向一个空地址,即NULL指针,也可以指向一个未知的地址,即野指针。
引用必须指向一个已经存在的变量,否则会产生编译错误。
(4)可以使用sizeof运算符
对于指针,可以使用sizeof运算符获取指针本身所占的字节数。
对于引用,由于其本质是一个别名,所以无法使用sizeof运算符获取其所占的字节数。
(5)作用域不同
指针可以在不同的作用域中声明,可以在函数内部创建并使用,也可以在函数外部声明并在多个函数中使用。
引用必须在声明时初始化,并且只能在声明所在的作用域内使用。
总结:指针可以指向任何类型的数据,而引用只能引用同类型的数据。指针可以被重新赋值,而引用不可以。指针可以为空,而引用必须始终引用一个有效的对象。在使用指针和引用时,需要注意它们的特点,以避免出现错误。