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