指针的数组 烧脑

来源:互联网 发布:etl数据清洗工具 编辑:程序博客网 时间:2024/06/05 22:43

今天只讲一个问题,就是指针二维数组的理解:

int a[3][4]={{1,3,5,7},{9,11,13,15},{17,19,21,23}};这是一个二维数组,它可以分为三个一维数组,即a[0],a[1],a[2],其中每个数组有四个元素,即a[0][0],a[0][1],a[0][2],a[0][3],a[1][0],a[1][1],a[1][2],a[1][3],a[2][0],a[2][1],a[2][2],a[2][3].

        a[0]1 3 5         7

a[1]9 11 13 15

a[2]17 19 21 23

这里面数组a的首地址是1,即a[0][0],就是0行的首地址,然后a+1就是往下移动,变成第一行的首地址,a[1]的第一个地址,就是9,然后a[0]是第一个一维数组的数组名和首地址,因此为1,*(a+0)与 a[0] 等效的, 它表示一维数组a[0]中第 0 个元素的首地址,也就是1,同理,a+1是二维数组1行的首地址,等于9,a[1]是第二个一维数组的数组名和首地址,因此也为9,因此a+1、a[1]、*(a+1)是等同的,这样可以推断出a[i]=*(a+i)。

另外,a[0]也可以看成是a[0]+0,是一维数组a[0]的0号元素的首地址,而a[0]+1则是a[0]的第1个元素首地址,由此可得出a[i]+j则是一维数组a[i]的j号元素首地址,它等于&a[i][j],由a[i]=*(a+i)得a[i]+j=*(a+i)+j,由于*(a+i)+j是二维数组a的i行j列元素的首地址,所以,该元素的值等于*(*(a+i)+j)。


int i;
int j;
int a[3][4]={{1,3,5,7},{9,11,13,15},{17,19,21,23}};
for(i=0;i<3;i++){
for(j=0;j<4;j++){ 
printf("%d\n",a[i]+j);
}

printf("%d,%d\n",a,*a);
printf("%d,%d\n",a[0],*(a+0));
printf("%d,%d\n",&a[0],&a[0][0]);
printf("%d,%d\n",a[1],a+1);
printf("%d,%d\n",&a[1][0],*(a+1)+0);
printf("%d,%d\n",a[2],*(a+2));
printf("%d,%d\n",&a[2],a+2);
printf("%d,%d\n",a[1][0],*(*(a+1)+0));
printf("%d,%d\n",a[0],*(a+0));

然后今天打印了上面的一个程序,这里面输出的除了倒数第二行是9,9,其他全是地址,这里我总结了一下,存在两个中括号,两个*号的,输出的都是值,其他的全部都是地址,这个可能会存在错误,但是理解不了的话背下来也是一种办法吧。然后今天学的东西比较绕,真的是刚刚可能理解了,一下子被别人讲解下,一下子就绕晕了,所以还是要再看下把。

0 0