c语言指针数组的具体使用
作者:鲍海超-GNUBHCkalitarro
下面我们再讨论一个特殊的数组,它的元素为指针。
我们先从普通的元素为 int 类型的数组开始。
int arr1[5] = {1, 2, 3, 4, 5}; int arr2[5] = {11, 22, 33, 44, 55}; int arr3[5] = {111, 222, 333, 444, 555};
arr1、arr2、arr3均为 int [5] 类型的数组。
若数组名出现在表达式中,即会转换为指向首元素的指针,即 int * 类型。我们将这几个数组的首元素指针存储在另一个元素为 int * 的数组里。
int *pToArr[3]; pToArr[0] = arr1; //arr1转换为首元素指针,int[5]到int* pToArr[1] = arr2; //arr2转换为首元素指针,int[5]到int* pToArr[2] = arr3; //arr3转换为首元素指针,int[5]到int* pToArr[0]的类型为 int* ,指向arr1的第1个元素。 pToArr[1]的类型为 int* ,指向arr2的第1个元素。 pToArr[2]的类型为 int* ,指向arr3的第1个元素。
pToArr的类型为 int *[3] ,是一个数组。它有3个元素,每个元素的类型为 int * 。
由于元素类型为指针,所有它也被称为指针数组。
定义和赋值完数组后,我们使用这个指针数组来访问所有元素。
for(int i = 0 ; i < 3; i ++) { int **p = pToArr + i; for(int j = 0; j < 5; j++) { printf("%d ", *(*p + j)); } printf("\n"); }
看,这段程序遍历了3个数组的元素。
不过,这段程序的类型转换和运算稍微有点多,别着急,我们下面来详细分析它。
pToArr是一个 int *[3] 类型的数组,若出现在表达式 p = pToArr + i 中,即转换为指向首元素的指针,即 int *[3] 转为 int ** 。
p + 0 类型为 int** ,指向pToArr的第1个元素。
p + 1 类型为 int** ,指向pToArr的第2个元素。
p + 2 类型为 int** ,指向pToArr的第3个元素。
接着,我们分析表达式 *(*p + j) 。
假设在 int **p = pToArr + i 中,i的值为0,那么p指向pToArr的第一个元素。
*p 表达式结果为pToArr[0],指向arr1的第一个元素。
表达式 *p + j ,分别指向arr1中各个元素。
最后,表达式 *(*p + j) 取得arr1数组内各个元素的值。
我们再来顺一个整个流程。
p ,指向 pToArr 的第一个元素,类型为 int ** 。
*p ,指向 arr1 的第一个元素,类型为 int * 。
*p + j ,指向 arr1 中的第j个元素,类型为 int * 。
*(*p + j) ,为 arr1 中的第j个元素。
这样即可完成对 arr1 的访问,随着循环的继续,i会变为1,2。
p会指向pToArr中的第二、第三个元素,按照上面的处理,会继续访问arr2,arr3中元素的访问。
到此这篇关于c语言指针数组的具体使用的文章就介绍到这了,更多相关c语言指针数组内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!