指针数组
指针数组是一个数组,其中的每个元素都是指针类型。这意味着每个元素可以指向一个不同的内存位置。指针数组的作用是方便地管理多个指针,每个指针可以指向不同的数据类型或者相同的数据类型。指针数组比较适合用来存储一组指针,每个指针可以指向一个独立的数据对象。这在处理多个相关的指针时非常有用。
-
首先,我们定义一个整数指针数组
int *arr[3]
,它包含了3个整数指针。这些指针可以指向不同的整数变量。 -
现在,我们创建一些整数变量:
int num1 = 10; int num2 = 20; int num3 = 30;
-
接下来,我们将这些整数指针指向这些整数变量:
arr[0] = &num1; // 第一个指针指向 num1 arr[1] = &num2; // 第二个指针指向 num2 arr[2] = &num3; // 第三个指针指向 num3
-
现在,我们可以通过遍历数组来访问每个指针所指向的数据。例如:
for (int i = 0; i < 3; i++) { printf("arr[%d] points to value: %d\n", i, *arr[i]); }
这段代码会输出:
arr[0] points to value: 10 arr[1] points to value: 20 arr[2] points to value: 30
- 指针数组是一个数组,其中的每个元素都是指针类型。每个指针可以指向不同的内存位置。
- 在这个例子中,我们创建了一个整数指针数组
int *arr[3]
,其中包含了3个整数指针。 - 我们将这些指针分别指向了不同的整数变量(
num1
、num2
、num3
)。 - 通过遍历数组,我们可以访问每个指针所指向的数据,从而实现了对不同整数变量的管理。
指针的指针
指针的指针,也叫做二级指针。
-
首先,我们知道指针是一个变量,它存储了一个内存地址。这个地址指向了某个数据的位置。比如,我可以定义一个整数指针
int *ptr
,它可以指向一个整数变量的内存地址。 -
现在,指针的指针就是一个指针,它指向了另一个指针的内存地址。这个另一个指针,也就是被指向的指针,它自己又可以指向某个数据的位置。所以,指针的指针实际上是一个指向指针的指针变量。
-
为什么我们需要指针的指针呢?有时候,我们需要在函数中修改指针的值。但是,如果我们只传递一个普通的指针作为参数,函数内部修改它的值并不会影响到外部的指针。这时,我们可以使用指针的指针。
-
让我们看一个例子。假设我们有一个整数指针
int *ptr1
,它指向了一个整数变量。现在,我们还有一个指向ptr1
的指针,叫做int **ptr2
。这就是一个指针的指针。 -
如果我们在函数中传递了
ptr2
,并在函数内部修改了它指向的ptr1
的值,那么外部的ptr1
也会被修改。这样,我们就可以通过指针的指针来实现对外部指针的修改
#include <stdio.h>
int main() {
int num = 42; // 一个整数变量
int *ptr1 = # // 指向整数的指针
int **ptr2 = &ptr1; // 指向指针的指针
// 修改 num 的值
*ptr1 = 100;
// 修改 ptr1 的值,让它指向另一个整数变量
int another_num = 200;
ptr1 = &another_num;
// 通过 ptr2 间接修改 num 的值
**ptr2 = 300;
// 打印结果
printf("num = %d\n", num); // 应该是 300
printf("another_num = %d\n", another_num); // 应该是 200
return 0;}
在这个代码中,我们定义了一个整数变量 num
,一个整数指针 ptr1
,和一个指针的指针 ptr2
。我们通过 ptr1
和 ptr2
来修改 num
的值,展示了指针的指针的作用。
补充:
-
一级指针:一级指针其实就是我们平时常见的普通指针。例如,我们可以定义一个整数指针
int *ptr1
,它可以指向一个整数变量的内存地址。 -
二级指针:二级指针是指向一级指针的指针。也就是说,如果一个指针指向的是另外一个指针,我们就称它为二级指针,或者指向指针的指针。例如:
int a = 12; int *b = &a; // 一级指针 int **c = &b; // 二级指针,指针c指向的是指针b,也就是说二级指针c存储的是一级指针b的地址。
-
三级指针:三级指针是指向二级指针的指针。规律是,n级指针就是指向n-1级指针的指针。例如:
int a = 12; int *b = &a; // 一级指针 int **c = &b; // 二级指针,指针c指向的是指针b的地址 int ***d = &c; // 三级指针,指针d指向的是指针c的地址
因此,如果我们在三级指针前面加一个取地址运算符
&d
,那么取出的是其自身的存储地址。而*d
则是取到指针c的地址,**d
则是取到指针b的地址,***d
则是取到a地址上的数据。