C_多维数组和指针

C_多维数组和指针

用指针变量可以指向一维数组中的元素,也可以指向多维数组中的元素。

先回顾一下多维数组的性质,可以认为二维数组是“数组的数组”,例 :

定义int a[3][4]={{1,3,5,7},{9,11,13,15},{17,19,21,23}};

则二维数组a是由3个一维数组所组成的。设二维数组的首行的首地址为2000

则有……

第一行地址a[0]2000 a[0][0]2004 a[0][1]2008 a[0][2]2012 a[0][3]
存放数据1357
第二行地址a[1]2016 a[1][0]2020 a[1][1]2024 a[1][2]2028 a[1][3]
存放数据9111315
第三行地址a[2]2032 a[2][0]2036 a[2][1]2040 a[2][2]2044 a[2][3]
存放数据17192123
表 示 形 式含义地 址
a二维数组名,指向一维数组a[0],即0行首地址2000
a[0], *(a+0), *a0行0列元素地址2000
a+1,&a[1]1行首地址2016
a[1],*(a+1)1行0列元素a[1][0]的地址2016
a[1]+2, *(a+1)+2, &a[1][2]1行2列元素a[1][2] 的地址2024
*(a[1]+2), *(*(a+1)+2), a[1][2]1行2列元素a[1][2]的值元素值为13
/**
* 一维数组里面存放的是二维数组的地址
* 二维数组才是真正存放的是数值
*/
a[i][j] = *(*(a+i)+j)
a[i][j]...[z]=*(*(...*(a+i)+j)...+z)
#include <stdio.h>

void main()
{
    int a[3][4] = {0,1,2,3,4,5,6,7,8,9,10,11};

    printf("a: %d\n", a);

    printf("*a: %d\n", *a);

    printf("a[0]: %d\n", a[0]);

    printf("&a[0]: %d\n", &a[0]);

    printf("&a[0][0]: %d\n", &a[0][0]);

    printf("a+1: %d\n", a+1);

    printf("*(a+1): %d\n", *(a+1));

    printf("a[1]: %d\n", a[1]);

    printf("&a[1]: %d\n", &a[1]);

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

    printf("a+2: %d\n", a+2);

    printf("*(a+2): %d\n", *(a+2));

    printf("a[2]: %d\n", a[2]);

    printf("&a[2]: %d\n", &a[2]);

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

    printf("a[1]+1: %d\n", a[1]+1);

    printf("*(a+1)+1: %d\n", *(a+1)+1);

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

    printf("*(*(a+1)+1): %d\n", *(*(a+1)+1));

}

指向多维数组元素的指针变量

把二维数组a分解为一维数组a[0],a[1],a[2]之后,设p为指向二维数组的指针变量。可定义为:

​ int (*p)[4]

它表示p是一个指针变量,它指向包含4个元素的一维数组。若指向第一个一维数组a[0],其值等于a,a[0],&a[0][0]‘等。而p+i则指向一维数组a[i]。

二维数组的指针变量说明的一般形式为:

类型说明符 (*指针变量名)[长度]

其中“类型说明符”为所指数组的数据类型*表示其后的变量是指针类型。“长度”表示二维数组分解为多个一维数组时,一维数组的长度,也就是二维数组的列数。

用指针输出二维数组的数值

#include <stdio.h>

void main()
{

    int a[3][4] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11};

    int (*p)[4];

    int i, j;

    p = a;

    for( i=0; i < 3; i++)
    {
          for( j=0; j < 4; j++) 
          {
                printf("%2d  ", *(*(p+i)+j));

          }
          printf("\n");
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值