指针简单用法

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\n,*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\n", 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

 

posted @ 2016-07-28 20:55  yifan_2015  阅读(281)  评论(0编辑  收藏  举报