• 《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陷阱与缺陷》上面有篇幅讲到,因此特意学习一下。 

  • 相关阅读:
    python sys.path.append
    python中的map()函数
    python中的map、filter、reduce函数
    上传文件2.0--drp203
    The import org.apache.commons.fileupload cannot be resolved
    让我会好好学习一阵子的东西
    【JSP】--Error错误页设置,声明式异常--188 drp
    【JSP】--重定向,转发--186 drp
    【JSP】--路径问题--如何去掉../,直接写绝对路径
    主备切换,双机热备,负载均衡,nginx
  • 原文地址:https://www.cnblogs.com/CodeWorkerLiMing/p/12831719.html
Copyright © 2020-2023  润新知