当我第一次看见数组指针和指针数组这两个名字的时候,我以为是一个东西呢,当看到英文解释就知道这两个是不一样的了。
指针数组:array of pointers,用于存储指针的数组,也就是数组元素都是指针
数组指针:a pointer to an array,指向数组的指针,数组可以是任意维的
下面举例说明:
int a[3][4] --->这个无需多说,就是一个二维数组。
int (*p)[4] --->就相当于int p[][4],它是一个二维数组的指针,可以指向一个第二维度为4的二维数组。
直接上代码:
1、二维数组的指针输出:
1 #include <iostream> 2 #include <algorithm> 3 #include <cstdio> 4 using namespace std; 5 int main() { 6 int a[3][4] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11}; 7 int *p, i, j; 8 p = &a[0][0]; //or p = a[0]; //or p = *(a+0);// or p = *a; 9 for (int i = 0; i < 3; ++i) { 10 for (int j = 0; j < 4; ++j) { 11 printf ("%4d", *p++); 12 } 13 printf (" "); 14 } 15 return 0; 16 }
2、二维数组的指针数组输出:
1 #include <iostream> 2 #include <algorithm> 3 #include <cstdio> 4 using namespace std; 5 int main() { 6 int a[3][4] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11}; 7 int (*p)[4] , i, j; 8 p = a; 9 for (int i = 0; i < 3; ++i) { 10 for (int j = 0; j < 4; ++j) { 11 printf ("%4d", *(*(p + i) + j)); 12 } 13 printf (" "); 14 } 15 return 0; 16 }
3、输入输出任意行的二维数组:
1 #include <iostream> 2 #include <algorithm> 3 #include <cstdio> 4 using namespace std; 5 void input (int *a, int m, int n) { 6 printf ("请输入%d行,%d列的二维数组: ", m, n); 7 for (int i = 0; i < m; ++i) 8 for (int j = 0; j < n; ++j) 9 scanf ("%d", a + i * n + j); // or scanf ("%d", &a[i*n+j]); 10 } 11 void print (int *a, int m, int n) { 12 for (int i = 0; i < m; ++i) { 13 for (int j = 0; j < n; ++j) 14 printf ("%4d", *(a + i * n + j)); //or printf ("%4d", a[i * n + j]); 15 printf (" "); 16 } 17 } 18 int main() { 19 int a[2][4], b[3][3];//两个数组可以设置为最大值,认为输入大小 20 input (*a, 2, 4); //or input (a, 2, 4); // or input (a[0], 2, 4); //or input (a[0][0], 2, 4) //////input (a, 2, 4) 不行的哦; 21 input (*b, 3, 3); 22 printf("数组a: "); 23 print (a[0], 2, 4); 24 printf ("数组b: "); 25 print (b[0], 3, 3); 26 return 0; 27 } 28 29 /* 30 请输入2行,4列的二维数组: 31 1 2 3 4 32 5 6 7 8 33 请输入3行,3列的二维数组: 34 1 2 3 35 4 5 6 36 7 8 9 37 数组a: 38 1 2 3 4 39 5 6 7 8 40 数组b: 41 1 2 3 42 4 5 6 43 7 8 9 44 */
差不多了,再遇到值得记录的了再加。