指针数组是一个数组,它的每个元素都是一个指针。在C语言中,指针数组常用于存储指向多个相同类型数据项(如整数、字符串等)的指针。以下是一个关于指针数组的详细代码示例,包括如何声明、初始化和使用指针数组。
#include <stdio.h> #include <stdlib.h> #include <string.h> // 假设我们要存储指向字符串的指针数组 // 函数原型,用于打印指针数组中的字符串 void printStringArray(char** strings, int size); int main() { // 声明一个指针数组,用于存储指向字符串的指针 // 这里我们假设要存储5个字符串的指针 const int SIZE = 5; char* stringArray[SIZE]; // 为指针数组中的每个指针分配内存并初始化 stringArray[0] = strdup("Hello"); // 使用strdup复制字符串并分配内存 stringArray[1] = strdup("World"); stringArray[2] = strdup("This"); stringArray[3] = strdup("is"); stringArray[4] = strdup("a"); stringArray[4] = realloc(stringArray[4], strlen("an") + 1); // 假设我们要改变最后一个字符串 strcpy(stringArray[4], "an"); // 使用strcpy更新字符串内容 // 验证指针数组的内容 printf("The strings in the array are:\n"); printStringArray(stringArray, SIZE); // 释放之前为字符串分配的内存 for (int i = 0; i < SIZE; i++) { free(stringArray[i]); } // 注意:stringArray本身(即指针数组)的内存是在栈上分配的, // 因此不需要(也不能)手动释放。它会在main函数返回时自动释放。 return 0; } // 函数定义:打印指针数组中的字符串 void printStringArray(char** strings, int size) { for (int i = 0; i < size; i++) { printf("%s ", strings[i]); } printf("\n"); }
代码解释:
- 指针数组的声明:在main函数中,我们声明了一个名为stringArray的指针数组,它能够存储5个指向char的指针(即字符串的指针)。
- 内存分配和初始化:使用strdup函数为每个指针分配内存并复制一个字符串。strdup是POSIX标准中的函数,它在堆上分配足够的内存来复制一个字符串,并返回指向新字符串的指针。如果系统不支持strdup,可以手动使用malloc和strcpy来实现相同的功能。
- 修改指针数组中的元素:我们使用realloc来重新分配最后一个字符串的内存,并使用strcpy来更新其内容。这是一个动态改变字符串内容的例子。
- 访问和打印指针数组:我们定义了一个printStringArray函数来遍历指针数组并打印每个指针所指向的字符串。
- 内存释放:在使用完字符串后,我们使用free函数来释放之前为它们分配的内存。这是非常重要的,因为忘记释放内存会导致内存泄漏。
- 指针数组的生命周期:stringArray指针数组本身是在栈上分配的,因此它会在main函数返回时自动释放。我们不需要(也不能)手动释放它。
这个示例展示了如何使用指针数组来存储和管理多个字符串。在实际应用中,指针数组可以用于更复杂的场景,如动态数组、图的数据结构等。