• 二维数组 我被你搞糊涂了


    转载自:http://blog.chinaunix.net/uid-26694208-id-3842773.html

    指向一个由n个元素所组成的数组指针

    在Turbo C中, 可定义如下的指针变量:

    int (*p)[3];

    指针p为指向一个由3个元素所组成的整型数组指针(指向数组的指针)。在定义中, 圆括号是不能少的, 否则它是指针数组。这种数组的指针不同于前面介绍的整型指针, 当整型指针指向一个整型数组的元素时, 进行指针(地址)加1运算, 表示指向数组的下一个元素, 此时地址值增加了2(因为放大因子为2), 而如上所定义的指向一个由3个元素组成的数组指针, 进行地址加1运算时, 其地址值增加了6(放大因子为2x3=6), 这种数组指针在Turbo C中用得较少, 但在处理二维数组时, 还是很方便的。例如:

    int a[3][4], (*p)[4];

    p=a;

    开始时p指向二维数组第0行, 当进行p+1运算时, 根据地址运算规则, 此时放大因子为4x2=8, 所以此时正好指向二维数组的第1行。和二维数组元素地址计算的规则一样, *p+1指向a[0][1], *(p+i)+j则指向数组元素a[i][j]。

    备注:

    int a[10][20]; //真正的二维数组

    int *b[10]; //定义分配了10个指针,没有初始化。换句话说,b是一个由10个整型(int)指针构成的指针数组。

    int (*p)[3]; //指向数组的指针

    int *p(); //p是一个函数,返回值是一个int型指针

    int (*p)(); //指向函数的指针

    float **p; // p不是二维数组的指针,而是指向指针的指针,即二级指针。

    前面是理论知识,后面说我遇到的问题,计算AD7606多通道数据我需要建立一个二维数组,这样每个通道的采样点能够集中起来,在进行fft运算的时候能够直接作为输入,但是在传递这个二维数组时经常遇到问题,

    定义一个二维数组:float AD_Data[8][2*64]; 希望通过一个地址指针的形式来传递它,但是如果定义 float *buff; 这样并不能把AD_Data赋值给buff,这个buff的定义必须为int (*p)[3],这样定义起来看着也麻烦,每次看到都要挠头,另外在做形参时,二维数组要定义成,例如:int main(int argc, char** argv) ; int main(int argc, char* argv[])这是main函数通常的定义方式,我经常定义的是buff[][2*64] 这种形式,这样也代表一个二维指针,同事推荐用结构体的形式来绕过二维数组,我觉得这个方法很好,避免了二维数组传递带来的困惑,例如typedef struct _ARRAY{ float channel[2*64]; }array; 这样定义二维数组的时候可以这样array[8];参数传递的时候直接结构体指针就行了,结构体的封装还是让操作相对简单和直观一点,当然我还是希望能够很熟练的掌握二维数组与指针的,但是目前还是一维数组操作起来直观。数组指针,指针数组,继续学习吧。

    还有一些关于柔性数组的知识可以看这里http://www.cppblog.com/Dream5/articles/148386.html

  • 相关阅读:
    Spring Boot 快速入门
    mySql 主从复制linux配置
    Neural Networks for Machine Learning by Geoffrey Hinton (1~2)
    DIV浮动IE文本产生3象素的bug
    Leet Code OJ 338. Counting Bits [Difficulty: Medium]
    Unity3D:Gizmos画圆(原创)
    科学世界的人文关怀:开源科学与人工智能
    使用c#訪问Access数据库时,提示找不到可安装的 ISAM
    Android API Guides---Services
    《从0到1》读书笔记第一章"未来的挑战"第2记:做老子还是做孙子
  • 原文地址:https://www.cnblogs.com/longbiao831/p/4729905.html
Copyright © 2020-2023  润新知