zoukankan      html  css  js  c++  java
  • 数组是什么

    数组在c的表现是一些连续地址的指针

    int a[3]

    这个a 是数组类型,但a也是个指针,是a[0]的指针,根据“一些连续地址的指针"规则

    a[1] 自然是 a+1:指针地址的值+1

    这就是数组,至于多维数组,他的指针仍然是连续的,只是可以[0][1]这样取而体现了不同。

    那么这个a到底是什么呢 还是把他理解为指针变量 最清晰,这样在动态申请数组内存的时候对于变量就更好理解

    数组a[0]的指针就是数组a的指针就是数组a。

    malloc(sizeof(int*)*4)   申请4个int大的的内存(连续的)

    (int*)malloc(sizeof(int*)*4) 转换为int指针 a[0]是* 指向int

    int **a = (int**)malloc(sizeof(int*)*4) a[0]是*,指向*,*指向int

    那么理解 “连续地址的指针”  再去理解链表与数组到底哪个快就更好理解了

    如果顺序读取(按顺序读) 其实是没有区别的

    链表是通过指针找到下一个指针,数组是能过指针0+n指到下一个

    但不按顺序读取时,

    链表一个一个读的逻辑,再与数组的指针+n计算指针地址逻辑比,明显数组的读取就快了。

    同样,由于逻辑不同,链表也有删除的优点。

    看起来 "按地址计算其他位置" 与 “指针指向下个位置” 是完全不同的逻辑,而且是完全无法相融合的逻辑。

    甚至于细想想,这好像完全不是能一起比较的两种方案。一个硬件派,一个逻辑派。

    指针数组与数组指针

    int *p1[10]; 包含指针的数组

    int (*p2)[10];  指向数组的指针

    “[]”的优先级比“*”要高。

    p1 先与“[]”结合,构成一个数组的定义,数组名为p1,int *修饰的是数组的内容,即数组的每个元素。

    那现在我们清楚,这是一个数组,其包含10 个指向int 类型数据的指针,即指针数组。

    至于p2 就更好理解了,在这里“()”的优先级比“[]”高,“*”号和p2 构成一个指针的定义,指针变量名为p2,int 修饰的是数组的内容,即数组的每个元素。数组在这里并没有名字,是个匿名数组。那现在我们清楚p2 是一个指针,它指向一个包含10 个int 类型数据的数组,即数组指针。

    一个小技巧

    (*p)[10] 

    *p+1 == (*p)[1]

  • 相关阅读:
    队列数据结构与算法JavaScript描述(5)
    栈数据结构与算法Javascript描述(4)
    散列数据结构与算法JavaScript描述(8)
    Evevt Loop、任务队列、定时器等
    OSGi初始篇
    应用服务平台与应用服务器
    数据源相关规范整理
    新手入门:教您最优的J2EE学习经验和流程
    TableView的使用
    Strategy
  • 原文地址:https://www.cnblogs.com/mattins/p/3337547.html
Copyright © 2011-2022 走看看