(*p)[ ] 与*p[ ]的区别
1. int (*p)[2] 表示一个指向一维整型数组的指针
想想一个简单的指针, int *q = a; // int a[] = {1, 2, 3, 4};
对于int (*p)[2] = a; // int a[][2] = {1, 2, 3, 4, 5, 6};
只是对*q 的一个扩展, 由一维变成了二维。 从指针指向的的对象就可以看出。
(int (*p)[] 指向数组, *p 指向基本类型(不包括数组))
所以, 我们可以使用与int *q类似的方式使用int (*p)[]
#include <stdio.h> int main () { int i, j; int a[5][2] = {0,1,2,3,4,5,6,7,8,9}; int (*p)[2] = a; for (i = 0; i < 5; i ++) { for (j = 0; j < 2; j ++) { printf ("%d ", p[i][j]); } printf ("\n"); } return 0; }
2. int *p[5] 表示一个指针数组, 该数组有5个元素, 每个元素都是一个指向整型对象的指针。
#include <stdio.h> int main() { int i, j; int a[][2] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; int *p[5]; for (i = 0; i < 5; i ++) { p[i] = a[i]; for (j = 0; j < 2; j ++) { printf ("%d ", p[i][j]); } printf ("\n"); } }
想想在函数传参时, 是否可以这样传参呢?
声明一个函数 void print (int *p[], int n);
这样传参对吗? print (a, 5);
答案是不对, 因为实参a是一个指向数组的指针,类型为int (*)[]; 而int *[]则是一个指针数组, 类型为int **(二级指针),存在编译错误, 类型不一致, 且无法自动转换。
有一个小疑问, 在命令行参数中 int main (int argc, char *argv[]) , 这里的参数是如何传递的呢?
3. 两者之间的区别
由以上的分析可知, int (*p)[] 是需知低维(或列), 而int *p[]则是须知高维(或行, 数组有几个元素)
可以按多级指针或多维数组的扩展方式, 扩展到多级或多维。