C语言-指针数组和数组指针
在C语言中,int* p[3]
和 int (*p)[3]
的区别与运算符优先级和声明类型密切相关:
int* p[3]
• 类型:指针数组
• 含义:声明一个包含3个元素的数组,每个元素是int*
类型的指针
• 优先级:[]
优先级高于 *
,因此p
先与[3]
结合
• 内存布局:
p[0] → 某个int变量的地址
p[1] → 另一个int变量的地址
p[2] → 第三个int变量的地址
• 典型用途:存储多个独立指针
int a = 1, b = 2, c = 3;
int* p[3] = {&a, &b, &c};
int (*p)[3]
• 类型:数组指针
• 含义:声明一个指针,指向一个包含3个int
元素的数组
• 优先级:()
强制*
先与p
结合
• 内存布局:
p → 指向一个二维数组的行(该行有3个int元素)
• 典型用途:操作二维数组的行
int arr[2][3] = {{1,2,3}, {4,5,6}};
int (*p)[3] = arr; // p指向arr的第一行
printf("%d", (*p)[1]); // 输出第1行第2个元素:2
关键区别
特性 | int* p[3] | int (*p)[3] |
---|---|---|
类型 | 指针数组 | 数组指针 |
元素类型 | int* | 指向int[3] 的指针 |
内存占用 | 3个指针的空间 | 1个指针的空间 |
解引用结果 | 单个int 值 | 一个int[3] 数组 |
+1操作步长 | 移动一个指针大小(如4字节) | 移动整个数组大小(12字节) |
示例对比
指针数组 (int* p[3]
)
int a = 10, b = 20, c = 30;
int* p[3] = {&a, &b, &c};
printf("%d", *p[1]); // 输出20(访问第二个指针指向的值)
数组指针 (int (*p)[3]
)
int arr[2][3] = {{1,2,3}, {4,5,6}};
int (*p)[3] = &arr[0]; // 指向第一行
printf("%d", (*p)[2]); // 输出3(访问第一行第三个元素)
p++; // 移动到下一行
printf("%d", (*p)[0]); // 输出4(第二行第一个元素)
总结
• int* p[3]
:当需要存储多个独立指针时使用(如字符串数组)
• int (*p)[3]
:当需要按行操作二维数组时使用(如矩阵遍历)
• 括号()
的作用:改变运算符优先级,明确指针的指向目标类型