zoukankan      html  css  js  c++  java
  • 《c陷阱与缺陷》——数组与指针的关系(一维数组,二维数组)

    一维数组、指针的关系
    定义数组
    int array[3] = {0,12,2};
    定义数组指针,指向一个大小为3个整型的数组
    int (*ap)[3] = array; 其实这个方式的赋值,编译器会出现类型不匹配的报警,warning: assignment from incompatible pointer type,但是程序员应该知道会用。
    普通的整型指针
    int *intmp = array;这个比较简单的,不细讲了

    以数组指针访问一维数组的方式:
    for (int i = 0; i < 3; i++)
    {
    printf("*(intmp[%d]) = %d ", i, *(*(ap) + i)); //valid 等价于*(*(ap+0) + i)
    ap+1,就增加一个数组大小,而不是int大小。这点和整型指针有区别。
    printf("*(intmp[%d]) = 0x%x ", i, (*(ap) + i)); //valid
    printf(" ");
    }
    二位数组、数组指针的关系
    int cal[12][3] =
    {
    [0] = {[0] = 11},
    [1] = {[1] = 22},
    };

    int (*mp)[3] = cal; 这个方式的赋值没有编译器报警。是正确的。

    mp = cal;

    以数组指针访问二维数组
    1、打印数组内容
    for (int i = 0; i < 12; i++)
    {
    for (int j = 0; j < 3; j++)
    {
    printf("mp[%d][%d] = %d ", i, j, mp[i][j]); 等价于*(*(mp+i) + j)
    }
    printf(" ");
    }
    赋值操作,如果int *ap=cal,编译会报警,但是可以运行,但是不能执行ap[i][j]的操作,只能ap[i]
    int value = 0;
    for (mp = &cal[0]; mp < &cal[12]; mp++)
    {
    int *dayp;
    for (dayp = *mp; dayp < & (*mp)[3]; dayp++)
    {
    value++;
    *dayp = value;
    }
    }
    mp从cal[0]元素遍历到cal[12],注意&符号,如果没有加,编译器会报警。assignment from incompatible pointer type,comparison of distinct pointer types lacks a cast(来自不兼容指针类型的赋值,不同指针类型的比较缺少强制转换) 因此建议加上。
    或者使用for (mp = cal; mp < cal + 12; mp++)这种方式,比较容易懂,意思是mp指针分别遍历12个数组元素,每个数组元素包含一个子数组,子数组中有3个int元素,

    for (dayp = *mp; dayp < & (*mp)[3]; dayp++)等价于for (dayp = (*(mp+0)+0); dayp < (*(mp+0)+3); dayp++)

    其实,这种方式一般新手是使用的比较少的,一般直接使用数组的形式,因为看到《c陷阱与缺陷》上面有篇幅讲到,因此特意学习一下。 

  • 相关阅读:
    java Class.getResource和ClassLoader.getResource
    Ext Grid控件的配置与方法
    BLANK_IMAGE_URL
    js中变量和jsp中java代码中变量互相访问解决方案
    PL/SQL
    滴滴2021后端开发岗笔试:
    顺丰科技2021研发岗笔试:贪心算法应用
    2021顺丰科技研发笔试: 深度优先算法的应用
    动态规划算法轻松解决01背包,完全背包,多重背包问题
    寻找二叉树的最近公共祖先
  • 原文地址:https://www.cnblogs.com/CodeWorkerLiMing/p/12831719.html
Copyright © 2011-2022 走看看