2.5 指针和引用
2.5.1 指针
指针是一种数据类型,具有指针类型的变量称为指针变量。可以将指针看作一种特殊的变量。
1. 什么是指针
指针是一种特殊的变量,具备一般变量的三个基本要素,但在类型和值上与一般变量有所不同。指针用于存放某个变量的地址值,因此,指针变量的数据值是某个变量在内存中的地址值。指针的类型是其所指向变量的类型,而不是指针本身的数据值类型。指针不仅可以指向各种类型的变量,还可以指向数组、函数、文件,甚至指向其他指针(即多级指针)。
例如:
int a = 5;
int *p = &a;
这里,定义了一个 int
型变量 a
,并初始化为5。int *p = &a
定义了一个指针 p
,它指向 int
型变量 a
,其中 &a
表示变量 a
的地址值。
2. 如何定义指针
定义指针时需要指定其类型,即在指针名前冠以 *
,表示 *
后面的变量是指针。其格式如下:
<类型> *<指针名1>, *<指针名2>, …;
例如:
int *pi; // pi 是一个指向 int 型变量的指针
float *pf; // pf 是一个指向 float 型变量的指针
char *pc; // pc 是一个指向 char 型变量的指针
int **pp; // pp 是一个指向指针的指针,即二级指针
3. 指针的赋值
任何类型的指针所赋的值都是内存地址值。地址值用变量名前加 &
表示。例如:
int a, b[10];
int *p = &a; // p 是一个指向 a 的指针
int *q = b; // q 是一个指向数组 b 的首元素的指针
数组的地址值用数组名表示,函数的地址值用函数名表示。例如:
double sin(double x);
double (*pf)(double) = sin; // pf 是一个指向函数 sin 的指针
4. 指针的运算
指针运算包括:
- 赋值运算:将一个指针所指向的变量的地址值赋给它。
- 加减运算:一个指针可以加上或减去一个整数值。
- 指针相减:指向同一个数组的两个指针可以相减,其差值是两个指针之间的元素个数。
- 指针比较:指向同一个数组的两个指针可以比较,当两个指针相等时,说明它们指向同一个数组元素。
2.5.2 指针和数组
在C++语言中,数组的元素可以用下标表示,也可用指针表示。使用指针表示数组元素处理起来更快,因此应尽量使用指针来引用数组元素。
1. 数组元素的指针表示
-
一维数组的指针表示
int a[5]; for (int i = 0; i < 5; ++i) { a[i] = i + 1; }
-
二维数组的指针表示
int b[2][5]; for (int i = 0; i < 2; ++i) { for (int j = 0; j < 5; ++j) { b[i][j] = i * 5 + j + 1; } }
-
三维数组的指针表示
int c[3][5][7]; for (int i = 0; i < 3; ++i) { for (int j = 0; j < 5; ++j) { for (int k = 0; k < 7; ++k) { c[i][j][k] = i * 35 + j * 7 + k + 1; } } }
2.5.3 指针数组和指向数组的指针
1. 指针数组
指针数组是元素为指针的数组。例如:
int *pa[3];
int a = 1, b = 2, c = 3;
pa[0] = &a;
pa[1] = &b;
pa[2] = &c;
2. 指向数组的指针
指向数组的指针是一个二级指针。例如:
int a[2][3] = {{1, 2, 3}, {4, 5, 6}};
int (*pa)[3] = a;
这里,pa
是指向二维数组 a
的指针。
2.5.4 字符指针
1. 字符指针
字符指针是指向字符串的指针。例如:
char *p = "hello";
字符指针比字符数组操作字符串更方便。
2. 字符指针数组
字符指针数组是元素为字符指针的数组。例如:
char *ps[3] = {"abc", "def", "ghi"};
2.5.5 引用
1. 引用的概念
引用是某个已知变量或对象的别名。引用自身没有值,也没有地址值,不占用内存空间。引用的值是被引用的变量或对象的值,引用的地址值是被引用的变量或对象的地址值。
2. 如何创建引用
创建引用的格式如下:
<类型> &<引用名> = <初始值>;
例如:
int a = 10;
int &ra = a;
总结
在C++中,指针和引用是非常重要的概念。指针用于存储变量的地址,而引用是变量的别名。理解和掌握指针和引用有助于编写高效和灵活的程序。在后续的章节中,我们将进一步探讨指针和引用在函数参数和返回值中的应用。