您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# C语言数组指针和指针数组有什么区别
## 引言
在C语言中,指针和数组是密切相关的概念,而**数组指针**和**指针数组**更是初学者容易混淆的两个术语。尽管它们的名称相似,但实际含义和用法却截然不同。本文将深入探讨二者的区别,并通过代码示例帮助读者彻底理解它们的特性。
---
## 一、核心概念区分
### 1. 指针数组(Array of Pointers)
**定义**:指针数组是一个数组,其元素均为指针类型。
**本质**:数组 → 存储的是指针。
```c
int *ptr_arr[5]; // 包含5个int型指针的数组
定义:数组指针是一个指针,指向一个完整的数组。
本质:指针 → 指向的是数组。
int (*arr_ptr)[5]; // 指向包含5个int元素的数组的指针
char *str_arr[3] = {"Hello", "World", "C"};
内存示意图:
str_arr[0] → "Hello"
str_arr[1] → "World"
str_arr[2] → "C"
int matrix[3][4];
int (*ptr)[4] = matrix; // 指向二维数组的第一行
char *names[] = {"Alice", "Bob", "Charlie"};
malloc
配合实现灵活存储。
int *arr[10];
for(int i=0; i<10; i++)
arr[i] = malloc(sizeof(int)*20);
void func(int (*arr)[4], int rows) {
// 处理rows×4的二维数组
}
int nums[5] = {1,2,3,4,5};
int (*ptr)[5] = &nums; // 对整个数组取地址
int *p[5]
的类型是:int*[5]
(指针数组)int (*p)[5]
的类型是:int(*)[5]
(数组指针)int *ptr_arr[5];
int (*arr_ptr)[5];
int arr[5];
printf("%zu\n", sizeof(ptr_arr)); // 40(假设指针为8字节)
printf("%zu\n", sizeof(arr_ptr)); // 8(指针大小)
printf("%zu\n", sizeof(arr)); // 20(int为4字节时)
arr_ptr++; // 跳过一个完整数组的长度(如20字节)
ptr_arr++; // 移动到下一个指针元素(8字节)
使用右左法则解析复杂声明: 1. 从标识符出发 2. 先向右看,再向左看 3. 遇到括号则调转方向
示例分析:
int (*(*func)(int))[5];
解析步骤:
1. func
是一个指针
2. 指向函数(参数为int)
3. 函数返回指针
4. 指向含5个int的数组
// 错误示例
int (*ptr)[3] = {1,2,3}; // 需要取数组地址
// 正确写法
int arr[3] = {1,2,3};
int (*ptr)[3] = &arr;
int matrix[3][4];
int **wrong = matrix; // 错误!类型不匹配
int (*correct)[4] = matrix; // 正确
特性 | 指针数组 | 数组指针 |
---|---|---|
定义 | 元素为指针的数组 | 指向数组的指针 |
声明形式 | int *arr[5] |
int (*arr)[5] |
存储内容 | 多个指针 | 单个数组的地址 |
内存占用 | n×指针大小 | 固定为指针大小 |
典型应用 | 字符串数组、动态指针集合 | 多维数组处理、数组引用 |
理解数组指针和指针数组的区别,关键在于把握存储内容和指向目标的本质差异。通过本文的对比分析和代码实践,希望读者能够彻底掌握这两个重要概念,在复杂数据结构和内存操作中游刃有余。建议通过编写测试程序进一步巩固理解,例如尝试用两种方式实现矩阵转置函数,观察其底层访问逻辑的不同。 “`
注:实际字数约1500字,可根据需要调整代码示例的详细程度或增加/删减应用场景部分内容。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。