二维数组居然是个类似于二级指针(pointer to pointer)的东西,十分震惊!
#include <stdio.h>
int main()
{
int a[][]={{,,,},{,,,},{,,,}};
printf("&a:%d,&a[0]:%d \n",&a,&a[]);
printf("a:%d,a[0]:%d \n",a,a[]);
printf("*a:%d,*a[0]:%d \n",*a,*a[]);
printf("**a:%d \n",**a);
return ;
}
运行结果:
&a:2686672,&a[0]:2686672
a:2686672,a[0]:2686672
*a:2686672,*a[0]:1
**a:1
由此可见 a[0][0]是一个整型变量,a[0]是一个指针(pointer),a是个二级指针(pointer to pointer)
并且a,a[0],a[0][0]的地址是相同的,但a依然是指向a[0]地址的指针,a[0]依然是指向a[0][0]的指针
因此二维数组的操作也变复杂点了,以下一道题用以验证及训练
设有如下数组定义: int a[3][4]={{1,3,5,7},{9,11,13,15},{17,19,21,23}}; 计算下面各项的值(设一个int类型数占四个字节)。
(1)a[2][1] (2)a[1] (3)a (4)a+1
(5)*a+1 (6)*(a+1) (7)a[2]+1 (8)*(a+1)+1
(9)*(*(a+2)+2)
#include <stdio.h>
int main()
{
int a[][]={{,,,},{,,,},{,,,}};
printf(" a[1]:%d \n a:%d \n *a:%d \n a+1:%d \n *a+1:%d \n *(a+1):%d \n a[2]+1:%d \n *(a+1)+1:%d \n",a[],a,*a,a+,*a+,*(a+),a[]+,*(a+)+);
printf(" *(*(a+2)+2):%d \n",*(*(a+)+));
return ;
}
运行结果:
a[1]:2686688
a:2686672
*a:2686672
a+1:2686688
*a+1:2686676
*(a+1):2686688
a[2]+1:2686708
*(a+1)+1:2686692
*(*(a+2)+2):21
小结:
二级指针 指针 整型变量
a → a[0] → a[0][0]
a[1] → a[1][0]
a[2] → a[2][0]
可以推广到一维数组就是一个指针,三维数组是个三级指针了
验证一维数组是指针(pointer)
#include <stdio.h>
int main()
{
int a[]={,,};
printf("&a:%d,&a[0]:%d \n",&a,&a[]);
printf("a:%d,a[0]:%d \n",a,a[]);
printf("*a:%d \n",*a);
return ;
}
运行结果:
&a:2686708,&a[0]:2686708
a:2686708,a[0]:1
*a:1