zoukankan      html  css  js  c++  java
  • 指针简单用法

    1、指针类型:对编译器来说,通过指针类型获取指针所指类型数据长度,一次确定指针单位增量。

    2、如指向同数组的两个指针p1-p2得到两地址间相隔元素个数(int类,地址差自动除以数据类型);其他仅有的指针合法运算 :同类赋值,整数增减,比较,强制转换。

    3、void指针可以和任何类型性指针相互赋值而不需要强制类型转化

    4、++与*优先级相同,右结合。运算符出现在变量同侧,由内之外结合

    *p++同*(p++)地址加

    (*p)++所指元素加

    4、指向“一维数组”的指针声明,求值,参数传递,用来处理二维数组

      float llr[N][M+1];//二维数组记录中间过程llr,  

     float (*p)[N][M] = llr;//指针

      firstLLR(gauss_out, llr);//进行第一次似然译码,生成一个N行,M+1列的LLR矩阵

    void firstLLR(float *gauss_out, float(*llr)[M+1]) {
        for (int16_t i = 0; i < N; i++) {
            *(*(llr + i) + M) = *(gauss_out + i) * DXRE;//输入的LLR在数组最右侧 b = *(*(llr + iniRol + j) + col + 1);
        }    
    }

    5、指针数组与二重指针

    char *string[];

    char **p;

    p=string;

    我喜欢画一个三列的表格第一列师二重指针,第二列是每一个数组名指针,第三列是数组元素

    typedef char* string;
    string list[] = {"afdfds","dfdfa","NULL"};
    for(string *p = list;*p != NULL;p++){
      printf("%s ,*p);
    }//o'reilly著C程序设计新思维,人民邮电出版社P118

    二维数组也可以处理,ij代表行列,不过比较烦

    const uint8 code Keypad_Chars[12][6] = 
    {    
        "1 ",    "2ABC",    "3DEF",
        "4GHI",    "5JKL",    "6MNO",
        "7PQRS","8TUV",    "9WXYZ",
        "*",    "0+",    "#"
    };
    uint8 (*KeyCodeMap)[6] = Keypad_Chars;
    
    if(*(*(KeyCodeMap + 3*i + j)) == '#')

    处理动态分配的二维数组

    void *alloc_2d(int data_size, int row, int col) {
        int i, j;
        void **p = malloc(row * sizeof(void*));
        if(p==NULL){
            printf("fail to malloc *PP");
            exit(1);
        }
        for (i = 0; i < row; i++) {
            p[i] = malloc(col*data_size);
            if (p[i] == NULL) {
                for (j = 0; j < i; j++) {
                    free(p[i]);
                }
                free(p);//一个数组不成,释放所有数组,释放指针数组
                printf("fail to malloc nod -- col:%d,Rol:%d", j, i);
                exit(1);
            }
        }
    }

    6、函数指针

    定义

    double(*a_fn_type)(int, int);//定义了一个有两个参数,返回double类型的名字叫做 a_fn_type的指针---声明
    a_fn_type(i,j);//与(*a_fn_type)(i,j);通用---调用

    在函数声明基础上添加(*),括号优先级大于*,函数名变为指针类型声明,主调函数只提供函数入口(函数名,函数名也是指针),函数参数在被调函数用指针时传入。

    void printBitree(bitree bt, void(*p)(int16_t, int16_t, float(*)[M+1]), float (*llr)[M+1] ) {//注意void(*p)参数数据类型
        if (bt != NULL){
            if (bt->col != M)//根节点 不操作
                (*p)(bt->iniRol, bt->col, llr);//前序,对节点f或g,第二种形式
                //printf("%d%d
    ", bt->iniRol, bt->col);
            printBitree(bt->lchild, fnod, llr);
            printBitree(bt->rchild, gnod, llr);
        }    
    }

    主调: printBitree(root, fnod, llr);

    typedef double(*a_fn_type)(int, int);
    double apply_a_fn(a_fn_type f, int a, int b){
        return f(a,b);//第一种形式
    }//o'reilly著C程序设计新思维,人民邮电出版社P119

    //typedef不懂去看k&r有讲解
    
    

    7、函数指针数组

    指针数组代替枚举,函数指针数组代替一个一个函数,对于选择switch case显得优化,程序引用C语言程序设计思想方法,尹宝林著

    #define NumberOf(x) (sizeof(x) / sizeof(x[0]))//求数组元素个数
    char *func_name[] = { "sin","cos","sqrt","log10","exp","fabs" };//指针数组
    double(*const func_tab[])(double) = { sin,cos,sqrt,log10,exp,fabs };//与指针数组次序对应的函数指针数组,参数多的可以//哑元
    
    int find_func(char *s) {
        int i;
        for (i = 0; i < numberof(func_name); i++) {
            if (strcmp(s, func_name[i]) == 0)
                return i;
        }
        return -1;
    }
    int main() {
        int f;
        scanf...v[1];//得到一个字符串
        f = find_func(v[1]);
        draw_func(func_tab[f]);
    }
    
    //下面shi上边两个函数的另一种写法
    typedef double(*FP)(double) ;
    FP find_func(char *s) {//double(*find_func(char *s))(double)返回指针函数的函数
        int i;
        for (i = 0; i < numberof(func_name); i++) {
            if (strcmp(s, func_name[i]) == 0)
                return func_tab[i];
        }
        return NULL;
    }
    int main() {
        FP f;
        scanf...v[1];//得到一个字符串
        f = find_func(v[1]);
        if (f = NULL)
        {
     
        }
        draw_func(f);
    }

    详细解释http://blog.sina.com.cn/s/blog_65fbc55601017e3l.html

     

  • 相关阅读:
    在esx上 docker的网络桥接
    docker 配置桥接网络
    docker 配置桥接网络
    perl 创建包
    perl 创建包
    perl 一个简单的面向对象的例子
    perl 一个简单的面向对象的例子
    perl 对象 bless 引用
    【技术角度看问题之一】ARM到底是个啥?
    【nodejs原理&源码赏析(3)】欣赏手术级的原型链加工艺术
  • 原文地址:https://www.cnblogs.com/yifan2015/p/5716206.html
Copyright © 2011-2022 走看看