zoukankan      html  css  js  c++  java
  • C语言笔记(二维数组与数值指针)

    一、关于二维数组和二维数组区别

    (1)一维数组在内存中是连续分布存储的,同样,二维数组也是在内存连续存储的。所以从内存的角度来分析,一维数组和二维数组其实没有本质区别。

    (2) 二维数组可以使用一维数组来代替。但是在实际的应用中,有时候使用二维数组会更加直观,方便程序的编程。

    (3)两者在内存使用效率上是一模一样的。

     

    二、二维数组的第一维和第二维概念

    (1)例如 int a[2][5]中,前面的2表示第一维;后面的5表示第二维

    (2) 二维数组的第一维表示最外部的那一层,第一维本身也是一个数组,里面存放了2个元素,这两个元素就分别是第二维的数组。第二维数组本身也是一个数组,里面存放的元素是普通的int型变量。

    三、二维数组的下标访问

    例1:

    1      int a[2][5] = {{1,2,3,4,5},{6,7,8,9,10}};
    2      int (*p)[5]; // 定义一个数组指针
    3      p = a;
    4      
    5      printf(" a[1][2]   = %d.
    ", a[1][2]);     // a[1][2] = 8
    6      printf("(*(p+1)+1) = %d.
    ", *(*(p+1)+2)); // a[1][2]

    运行结果:

     

    四、关于二维数据必须要明白的几个符号

    例2:理解 a 、&a、 a[0]、 &a[0]、 a[0][0]、 &a[0][0]

     1 /*
     2     二维数组的几个符号的测试
     3     1、a等同于&a[0]
     4     2、a[0]等同于&a[0][0]
     5     3、在数值上 a、&a、a[0]、&a[0]、&a[0][0] 是相等的,但是在类型上面是有区别的。
     6 */
     7     int a[2][5] = {{1,2,3,4,5},{6,7,8,9,10}};
     8     
     9     printf("a        = %p.
    ", a);        // a       类型是 int (*)[5]
    10     printf("&a       = %p.
    ", &a);       // &a      类型是 int (*)[2][5]
    11     printf("a[0]     = %p.
    ", a[0]);     // a[0]    类型是 int *
    12     printf("&a[0]    = %p.
    ", &a[0]);    // &a[0]   类型是 int (*)[5]
    13     printf("a[0][0]  = %d.
    ", a[0][0]);  // a[0][0] 类型是 int 
    14     printf("&a[0][0] = %p.
    ", &a[0][0]); // &a[0][0]类型是 int *

    运行结果:

     

    例3:第一维和第二维的数组指针的使用

     1     // 二维数组与指针的结合使用
     2     int a[2][5] = {{1,2,3,4,5},{6,7,8,9,10}};
     3     
     4     int (*p1)[5]; // 数组指针
     5     int *p2;      // 一般指针
     6     p1 = a;       // 等同 p1 = &a[0];     // 指向二维数组的数组名
     7     p2 = a[0];    // 等同 p2 = &a[0][0];  // 指向二维数组的第一维数组
     8 
     9     printf("a[0][2] = %d.
    ", *(*(p1+0)+2));  // a[0][2] = 3
    10     printf("a[1][2] = %d.
    ", *(*(p1+1)+2));  // a[1][2] = 8
    11      
    12     printf("a[0][2] = %d.
    ", *(p2+2));       // a[0][2] = 3
    13     printf("a[0][4] = %d.
    ", *(p2+4));       // a[0][4] = 5

    运行结果:

     

    五、总结

    (1)需要理解二维数组的实质和几个符号的含义。

    (2)二维数组和数组指针两者是有紧密的关系的。学会使用数组指针来操作二维数组,重在实践操作使用就会加深理解。

     

    注:学习笔记部分是在朱有鹏老师物联网视频教程中摘取,特此声明。http://www.zhulaoshi.org/

  • 相关阅读:
    bzoj 2142 礼物——扩展lucas模板
    bzoj 4591 [Shoi2015]超能粒子炮·改——组合数前缀和
    bzoj 4403 序列统计——转化成组合数的思路
    bzoj 2982 combination——lucas模板
    bzoj 3505 [Cqoi2014]数三角形——排列组合
    bzoj 3398 [Usaco2009 Feb]Bullcow 牡牛和牝牛——前缀和优化dp / 排列组合
    bzoj 1009 [HNOI2008]GT考试——kmp+矩阵优化dp
    bzoj 2427 [HAOI2010]软件安装
    bzoj 1951 [Sdoi2010]古代猪文 ——数学综合
    bzoj4247挂饰——DP
  • 原文地址:https://www.cnblogs.com/zou107/p/4909847.html
Copyright © 2011-2022 走看看