赞
踩
C语言中的指针和数组是两个非常基础的概念,它们可以用来处理复杂的数据结构和算法。而在指针和数组的基础上,又有两个重要的概念,那就是指针数组和数组指针。在本篇文章中,我们将详细介绍它们的定义、用法、案例、区别和注意事项。
指针数组,顾名思义,指针的数组,是一个数组,其中每个元素都是指针类型,表示该元素存放的是一个指针变量的地址。例如:
int *ptrArr[10]; //一个包含10个指针的数组,每个指针指向一个整型变量
指针数组可以使用正常的数组下标进行操作,也可以用指针的方式进行操作。例如下面的代码:
int num1 = 1, num2 = 2, num3 = 3;
int *ptrArr[3] = { &num1, &num2, &num3};
for (int i=0; i<3; i++){
printf("The address of num%d is %p, and its value is %d\n", i+1, ptrArr[i], *(ptrArr[i]));
}
数组的每个元素都是一个指向整数的指针变量,可以通过 for 循环遍历数组输出每个元素的地址和值。
指针数组常见的应用是在字符串处理中,可以将一个字符串拆分成多个单词,每个单词都放在指针数组的一个元素中,例如:
#include<stdio.h> #include<string.h> int main(){ char str[]="Hello World"; char *pArr[20]; int count=0; pArr[0]=strtok(str," "); while(pArr[count]!=NULL){ count++; pArr[count]=strtok(NULL," "); } for(int i=0;i<count;i++){ printf("The %dth word is %s.\n",i+1,pArr[i]); } return 0; }
该程序将字符串 “Hello World” 拆分成两个单词并输出。
使用指针数组时需要注意以下几点:
指针的类型必须与数组元素的类型相匹配。
需要保证指针指向的数据类型相同。
指针数组的下标从0开始,最大索引需要小于数组长度减1,否则会越界。
数组指针,顾名思义,数组的指针,是指针,是指向数组的指针,也就是一个指针变量,它存放的是一维或多维数组的首地址。所以一般在多维数组的时候用到数组指针。例如:
int (*ptrArr)[10]; //一个指向包含10个整数的数组的指针
数组指针可以用正常的指针方式进行操作,或者用数组的方式进行操作,例如下面的代码:
int numArr[3][5] = { {1,2,3,4,5},{6,7,8,9,10},{11,12,13,14,15}};
int (*ptrArr)[5] = numArr;
for (int i=0; i<3; i++){
for (int j=0; j<5; j++){
printf("%d\t", *(*(ptrArr+i)+j));
}
printf("\n");
}
该代码中,数组指针 ptrArr 存放了 numArr 数组的首地址,可以使用 dereference 和加法运算符来访问数组元素,也可以像普通数组那样使用下标运算符来访问数组元素。
数组指针常见应用是使用动态内存分配来声明一个动态多维数组,例如:
int m = 4, n = 5; int **ptrArr = new int *[m]; for (int i = 0; i < m; i++){ ptrArr[i] = new int [n]; } for (int i = 0; i < m; i++){ for (int j = 0; j < n; j++){ ptrArr[i][j] = i * n + j; } } for (int i = 0; i < m; i++){ for (int j = 0; j < n; j++){ printf("%d ", ptrArr[i][j]); } printf("\n"); } for (int i = 0; i < m; i++){ delete[] ptrArr[i]; } delete[] ptrArr;
该代码使用 new 运算符动态分配一个 m 行 n 列的二维数组,初始化并输出数组元素,最后释放内存。
使用数组指针时需要注意以下几点:
数组指针的大小等于数组元素的大小乘以数组元素的个数,即 ptrArr 整体大小为 4 x 5 x sizeof(int)。
在使用数组指针时,需要明确数组的长度,在访问指向的数组时需要保证数组下标不越界。
需要注意数组维数的问题,多维数组需要使用括号括起来才能定义出数组指针变量,例如 int (*)[20][30] p;
指针数组和数组指针最简单的区别是,前者是一个数组,它的每个元素都是一个指针,而后者是指向数组的指针,它存放的是数组的首地址。
指针数组多用于存储一组不同类型的数据,或者分隔有相同类型的数据,甚至可以混合使用不同数据类型的指针。而数组指针多用于处理一组相同类型的数据,或者处理多维数组。
在操作数组元素时,指针数组需要使用解引用符号,而数组指针可以像数组一样使用下标运算符。
指针数组和数组指针都是非常重要的C语言概念。在使用时,需要根据具体情况选取合适的类型。指针数组适合存储不同类型的指针以及用于处理字符串等问题,而数组指针适合用于处理多维数组或动态内存分配等问题。在使用时,还需要注意数组下标不越界等问题。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。