ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

C语言----指针与二维数组(高阶篇三十一)

2021-11-06 18:02:26  阅读:104  来源: 互联网

标签:ai 三十一 等价 C语言 ---- int 二维 数组 printf


 

  数组的特殊情况

    ※数组在定义时可以省略下标:

      int ai[]={1,2,3};

    编译器会自动算出此数组在初始化时有3个元素,自动定义成int ai[3]={1,2,3};

 

    这种方法经常用在字符串上:

      char str[]={“string”};

 

    ※二维数组初始化时,只有第一维下标可以省略:

      int ai[][3]={{1,2,3},{4,5,6}};

 

    ※也可以用一维数组的形式初始化二维数组:

      int ai[][3]={1,2,3,4,5,6};

    缺胳膊少腿也行:

      int ai[][3]={1,2,3,4};

    元素ai[1][1]和ai[1][2]会自动初始化为0

 

    ※无论多少维数组,它的内存都连成一片,我们可以用通过指针的移动来指向数组中的任何一个元素。

      int ai[][3]={1,2,3,4,5,6};

      int *pi=&ai[0][0];

      pi+=3;

      这时pi指向ai[1][0];

 

    注意以下写法都是错误的:

      ※int ai[][3]={{1,2,3}{4,5,6}};

      少了中间的逗号

 

      ※int ai[][3]={{1,2,3},{}};

      不能用空花括号初始化,一维数组也一样

 

      ※int ai[0];

      不能定义只有0个元素的数组

 

      ※int ai[3][]={{1,2,3},{4,5,6}};

      除第一维下标外,其它维的下标都不能省略

  二维数组与指针

    在学二维数组与指针之前,我们先回顾下一维数组与指针的关系。   

      a[3]等价于*(a+3)

      a[0]等价于*(a+0)等价于*a

 

   二维数组可当成是“数组的数组”,假设二维数组定义如下:

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

      a是个数组名,包含3个元素:a[0],a[1],a[2],每个元素又是一个数组,包含4个元素a[0][0],a[0][1],a[0][2],a[0][3]。

 

   从一维数组的知识得知:a[2]相当于*(a+2),但是它只能取到下一维数组的地址,即&a[2][0]。那么如何取到a[1][2]的内容呢?用如下方法:

        *(*(a+1)+2)

      它等价于

        a[1][2]

 

    ※一般在没有&影响的情况下,n维数组中有n个*就会取到数据,小于n个*,只能取到地址。

 

      通过以上表达式,我们可以推出另外几个表达式:

 

        a[0][1]等价于*(*(a+0)+1)等价于*(*a+1)

 

        a[1][0]等价于*(*(a+1)+0)等价于**(a+1)

 

        a[0][0]等价于*(*(a+0)+0)等价于**(a+0)

 

    题目讲解:

      已知数组int x[5][4]={0};中x的地址为0x0AFD0100,求**(x+3)+2、*x+3、*(*(x+3)+2)的地址或值。

      参考答案:2      0x0AFD010C     0

 

      说明:  一、**(x+3)+2相当于*(*(x+3)+0)+2相当于x[3][0]+2=2

 

           二、*x+3 相当于*(x+0)+3相当于x[0]+3相当于x[0][3]的地址&x[0][3],等于0x0AFD0100+3*4等于0x0AFD0100+C=0x0AFD010C。

 

           三、*(*(x+3)+2)相当于x[3][2]=0

 

    程序1

      二维数组与指针的关系

 

// 31-1二维数组与指针的关系.c


#include <stdio.h>

main()
{
    int a[2][3] = { 1,3,5,7,9,11 };    //定义二维数组

    printf("%d \n", &a);   
    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], a + 1);
    printf("%d,%d \n", &a[1][2], *(*(a + 1) + 2));
    printf("%d,%d \n", a[1][0], *(*(a + 1) + 0));
}

    测试结果:

 

 

  多维数组

    多维数组地址换算

 

 

 

     ※上图分析是通过元素个数来是计算地址:例子

      求  a[1][2][1] 的地址:

      a[1][2][1] =  2116 + (1 * 3 * 2 + 2 *2 + 1) *4 =  2160

    ※内存是线性结构,数组维数再多,也要通过公式转换为线性地址将数据存储在内存中。

 

标签:ai,三十一,等价,C语言,----,int,二维,数组,printf
来源: https://www.cnblogs.com/httpcc/p/15514600.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有