指针数组是由指针构成的数组,每个指针指向不同类型的数据。通过指针数组可以方便地操作多个变量,以及在一定程度上节省内存空间。指针数组的内存布局是连续的,可以按照下标访问不同的指针。使用指针数组时需要注意指针的初始化、赋值和释放。
指针数组的概念及作用
指针数组是指一个数组,其元素均为指针类型。指针是一种变量,储存的是内存地址,通过指针可以操作这个内存地址上的数据。指针数组可以储存多个指针,这些指针可以指向不同的变量或对象,在程序实现中常用于动态内存分配、多维数组等场景。
声明及初始化指针数组
声明一个指针数组的方式为:类型名 *数组名[数组大小]。例如,声明一个整型指针数组:
int *pArr[10];
其中,pArr表示指针数组的名称,[10]表示数组大小,int *为指针类型。
初始化指针数组的方式与普通数组相同,可以使用下标、循环等方式给每个元素赋值。例如,初始化一个包含5个指针的整型指针数组:
int *p[5];
int a = 1, b = 2, c = 3, d = 4, e = 5;
p[0] = &a;
p[1] = &b;
p[2] = &c;
p[3] = &d;
p[4] = &e;
上述代码中,&a表示a变量的地址,将其赋值给p[0],表示p[0]指向a变量。同理,p[1]指向b,以此类推。
指针数组与多维数组
指针数组可以用于实现多维数组的功能。以二维数组为例,可以使用一个指针数组储存一系列指针,每个指针又指向一个一维数组。例如:
int arr[2][3] = {{1,2,3}, {4,5,6}};
int *p[2];
p[0] = arr[0];
p[1] = arr[1];
其中,arr表示一个二维数组,p表示一个指针数组。p[0]指向arr[0]数组,p[1]指向arr[1]数组。通过p[0][1]即可访问arr[0][1],通过p[1][2]即可访问arr[1][2]。
指针数组与动态内存分配
指针数组还可以用于动态内存分配。在程序运行时,我们可以使用malloc等函数动态地分配内存,但返回的是一个内存地址,如果要使用这个内存地址,就需要将其赋值给指针。可以定义一个指针数组,每个元素都为指向动态分配的内存的指针,以实现动态内存分配的功能。
int *p[10];
for (int i = 0; i < 10; i++) {
p[i] = (int*)malloc(sizeof(int)*10);
}
上述代码中,定义了一个包含10个指向整型变量的指针的指针数组p。在循环中,使用malloc函数分配了10个整型变量大小的内存空间,并将返回的内存地址强制转换为整型指针类型赋值给p[i]。
指针数组与函数指针
函数指针是指向函数的指针,在指针数组中也可以使用函数指针。可以定义一个函数指针数组,每个元素都指向不同的函数,以实现函数指针的功能。
int add(int a, int b) {
return a + b;
}
int sub(int a, int b) {
return a - b;
}
int (*pFun[2])(int, int) = {add, sub};
以上代码定义了两个函数add和sub,pFun是一个包含两个指向返回值为整型、参数类型为两个整型的函数的函数指针的指针数组。pFun[0]指向add函数,pFun[1]指向sub函数。可以通过pFun[0](1,2)和pFun[1](3,4)来分别调用add和sub函数。
总结
指针数组是一个极为实用的数据类型,可以完成多种任务,如动态内存分配、多维数组、函数指针等。通过掌握指针数组,可以使我们更加灵活地操作内存空间,提高程序的效率。