type *array_name[size]
,其中type
是指针所指向的数据类型,array_name
是数组名,size
是数组的大小。例如,int *ptr_array[5]
定义了一个名为ptr_array
的指针数组,它包含 5 个指向int
类型数据的指针。int a = 10, b = 20, c = 30;
int *ptr_array[] = {&a, &b, &c};
int a = 10, b = 20, c = 30;
int *ptr_array[3];
ptr_array[0] = &a;
ptr_array[1] = &b;
ptr_array[2] = &c;
int a = 10;
int *ptr_array[1];
ptr_array[0] = &a;
printf("%d\n", *(ptr_array[0]));
char *str_array[] = {"Hello", "World", "C Language"};
type (*pointer_name)[size]
,其中type
是数组元素的数据类型,pointer_name
是指针变量名,size
是数组的大小。例如,int (*ptr)[5]
定义了一个名为ptr
的数组指针,它指向一个包含 5 个int
类型元素的数组。int arr[5] = {1, 2, 3, 4, 5};
int (*ptr)[5] = &arr;
(*ptr)[i]
。ptr[0][i]
来访问元素(这种方式在本质上与第一种相同,但写法更简洁)。例如:int arr[5] = {1, 2, 3, 4, 5};
int (*ptr)[5] = &arr;
printf("%d\n", (*ptr)[2]);
printf("%d\n", ptr[0][3]);
void print_array(int (*ptr)[5], int rows) {
for (int i = 0; i < rows; i++) {
for (int j = 0; j < 5; j++) {
printf("%d ", ptr[i][j]);
}
printf("\n");
}
}
int main() {
int arr[3][5] = {{1, 2, 3, 4, 5}, {6, 7, 8, 9, 10}, {11, 12, 13, 14, 15}};
print_array(arr, 3);
return 0;
}
type *array_name[size]
。type (*pointer_name)[size]
。type *
。type (*)[size]
,它是一个指向特定大小数组的指针。int a = 10, b = 20, c = 30;
int *ptr_array[] = {&a, &b, &c};
int **pptr = ptr_array;
printf("%d\n", **pptr);
int arr[3][4]
,可以定义一个数组指针int (*ptr)[4]
来指向它,通过ptr
可以方便地遍历和操作二维数组的行和列。qsort
函数对字符串数组进行排序:#include
#include
#include
int compare_strings(const void *a, const void *b) {
return strcmp(*(char **)a, *(char **)b);
}
int main() {
char *str_array[] = {"apple", "banana", "cherry", "date"};
int n = sizeof(str_array) / sizeof(str_array[0]);
qsort(str_array, n, sizeof(char *), compare_strings);
for (int i = 0; i < n; i++) {
printf("%s\n", str_array[i]);
}
return 0;
}
五、常见错误与注意事项
指针数组和数组指针是 C 语言中非常重要的概念,它们在内存管理、数据结构和函数调用等方面都有着广泛的应用。理解它们的定义、内存布局、初始化、访问方式以及应用场景,对于编写高效、灵活的 C 语言程序至关重要。同时,在使用过程中要注意避免常见的错误,如越界访问、野指针和内存泄漏等问题,以确保程序的稳定性和可靠性。通过不断地实践和深入理解,能够更好地掌握和运用指针数组和数组指针,提升 C 语言编程的能力和水平。