C语言中的多级指针、指针数组与数组指针
在C语言中,指针是一个非常重要的概念,它为我们提供了直接操作内存地址的能力。通过指针,我们可以访问和修改内存中的数据,实现各种灵活的操作。本文将通过示例代码和详细解释,深入探讨C语言中的多级指针、指针数组和数组指针。
1. 多级指针
多级指针是指指向指针的指针。在C语言中,我们可以定义一个指针变量来存储另一个变量的地址,同样,我们也可以定义一个指针变量来存储另一个指针变量的地址。这就是所谓的二级指针,以此类推,还可以有三级指针、四级指针等。
示例代码:
int a = 20;
int *p = &a; // 一级指针,指向变量a
int **pp = &p; // 二级指针,指向一级指针p
int ***ppp = &pp; // 三级指针,指向二级指针pp
printf("%d \n", ***ppp); // 输出20
这里,我们通过三级指针ppp
访问到了最初的变量a
的值。需要注意的是,每增加一级指针,我们就需要多使用一个*
来解引用。
2. 指针数组
指针数组是指数组中的每个元素都是一个指针。指针数组在C语言中常用于存储字符串、函数指针等。
示例代码:
int a1 = 10, b1 = 2, c1 = 3;
int *arr[] = {&a1, &b1, &c1}; // 定义一个指针数组,存储三个整型变量的地址
printf("%d\n", *arr[0]); // 输出10,访问指针数组的第一个元素所指向的值
int **p2 = arr; // 二级指针指向指针数组
printf("%d\n", **p2); // 输出10,通过二级指针访问指针数组的第一个元素所指向的值
这里,我们定义了一个指针数组arr
,它存储了三个整型变量的地址。然后,我们定义了一个二级指针p2
,让它指向指针数组arr
,通过**p2
访问到了指针数组的第一个元素所指向的值。
3. 数组指针
数组指针是指向数组的指针。在C语言中,数组名本身就是一个指向数组首元素的指针,但是数组指针和指向数组元素的指针是不同的。数组指针是指向整个数组的指针,它的步长是整个数组的大小。
示例代码:
int arr2[] = {111, 222, 333};
int(*pa)[3] = &arr2; // 定义一个数组指针,指向包含3个整数的数组
printf("%d %d %d\n", *(*pa + 0), *(*pa + 1), *(*pa + 2)); // 输出111 222 333
int arr3[][3]={{11,22,33},{44,55,66}};
int (*p3)[3]=arr3;
printf("%d\n",*(*(p3+1)+2)); // 输出66,通过数组指针访问二维数组的元素
printf("%d\n",p3[1][2]); // 输出66,直接通过数组名访问二维数组的元素
这里,我们定义了一个数组指针pa
,让它指向一个包含3个整数的数组。通过*(*pa + i)
的方式,我们可以访问数组中的元素。需要注意的是,*pa
表示的是整个数组的首地址,*pa + i
表示的是数组中第i
个元素的地址,*(*pa + i)
表示的就是对应地址上的值了。
同样地,我们还展示了如何通过数组指针访问二维数组的元素。需要注意的是,p3+1
表示的是跳过整个一行,因此*(p3+1)
表示的是第二行的首地址,*(*(p3+1)+2)
表示的就是第二行第三列的元素了。
总结
本文介绍了C语言中的多级指针、指针数组和数组指针的概念和用法。通过示例代码和详细解释,我们可以看到指针在C语言中的灵活性和强大之处。多级指针可以让我们间接地访问和修改内存中的数据;指针数组可以存储多个指针,常用于存储字符串、函数指针等;数组指针可以让我们以整个数组为单位进行操作,提供了更高的效率和灵活性。