C语言数组指针与指针数组

// 深入理解C语言中的两个重要概念
// 数组指针与指针数组

本课程将详细讲解数组指针和指针数组的概念、区别、用法以及常见应用场景。

适合有一定C语言基础的学习者。

1 / 8

指针数组 (Array of Pointers)

指针数组是一个数组,其中的每个元素都是一个指针

// 指针数组的声明语法
数据类型 *数组名[数组大小];
// 示例:包含3个int指针的数组
int *ptr_arr[3];

初始化示例

int a = 10, b = 20, c = 30;
int *ptr_arr[3] = {&a, &b, &c};
记忆技巧: "指针数组"重点是"数组" - 这是一个存储指针的数组。
2 / 8

指针数组的应用

1. 管理多个独立变量

int a = 1, b = 2, c = 3;
int *ptr_arr[3] = {&a, &b, &c};
printf("%d", *ptr_arr[0]); // 输出1

2. 字符串数组

char *names[] = {"Alice", "Bob", "Charlie"};
printf("%s", names[0]); // 输出"Alice"

3. 动态分配的多维数组

int rows = 3, cols = 4;
int *matrix[rows];
for (int i = 0; i < rows; i++) {
  matrix[i] = malloc(cols * sizeof(int));
}
3 / 8

数组指针 (Pointer to Array)

数组指针是一个指针,它指向一个整个数组

// 数组指针的声明语法
数据类型 (*指针名)[数组大小];
// 示例:指向包含5个int的数组的指针
int (*arr_ptr)[5];

初始化示例

int arr[5] = {1, 2, 3, 4, 5};
int (*arr_ptr)[5] = &arr;
记忆技巧: "数组指针"重点是"指针" - 这是一个指向数组的指针。
4 / 8

数组指针的应用

1. 操作二维数组

int matrix[3][4] = {
  {1, 2, 3, 4},
  {5, 6, 7, 8},
  {9, 10, 11, 12}
};
int (*ptr)[4] = matrix;
printf("%d", ptr[1][2]); // 输出7

2. 动态分配二维数组(连续内存)

int rows = 3, cols = 4;
int (*matrix)[cols] = malloc(rows * sizeof(*matrix));
// 使用后只需一次free释放内存
free(matrix);

3. 函数参数传递多维数组

// 函数声明
void process_matrix(int (*mat)[4], int rows);

// 函数调用
process_matrix(matrix, 3);
5 / 8

指针数组 vs 数组指针:核心区别

特性 指针数组 数组指针
本质 数组(元素是指针)[4](@ref) 指针(指向数组)[4](@ref)
声明语法 int *arr[5];[4](@ref) int (*arr)[5];[4](@ref)
内存占用 元素数 × 指针大小[4](@ref) 单个指针的大小[4](@ref)
+1操作步长 移动一个指针的大小[4](@ref) 移动整个数组的大小[4](@ref)
典型用途 字符串数组、命令行参数[4](@ref) 多维数组操作、矩阵运算[4](@ref)
运算符优先级: []的优先级高于*,因此int *p[]是指针数组,而int (*p)[]需要括号强制先解释*[4](@ref)。
6 / 8

练习题

问题1:以下哪个是指针数组的正确声明?

A. int *arr[5];
B. int (*arr)[5];
C. int *(arr[5]);
D. int (*arr[5]);

问题2:以下代码的输出是什么?

int main() {
  int arr[2][3] = {{1, 2, 3}, {4, 5, 6}};
  int (*p)[3] = arr;
  printf("%d", *(*(p+1)+2));
}
A. 2
B. 3
C. 6
D. 编译错误

问题3:关于指针数组和数组指针,以下说法正确的是:

A. 数组指针存储多个指针地址
B. 指针数组的每个元素都是指针类型
C. int (*ptr)[5] 是指针数组
D. 数组指针的步长是一个元素的大小
7 / 8

总结

关键区别:

1. 指针数组是数组,其元素都是指针[1,4](@ref)。

2. 数组指针是指针,指向整个数组[1,4](@ref)。

选择指南:

• 使用指针数组管理多个独立数组或不同长度的字符串[1,4](@ref)。

• 使用数组指针操作连续内存的二维数组或传递二维数组给函数[1,4](@ref)。

进一步学习建议:

1. 练习动态内存分配与指针的结合使用

2. 理解多级指针的概念和应用

3. 掌握函数指针的用法

8 / 8