博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
指针简单用法
阅读量:6347 次
发布时间:2019-06-22

本文共 3431 字,大约阅读时间需要 11 分钟。

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

 

转载于:https://www.cnblogs.com/yifan2015/p/5716206.html

你可能感兴趣的文章
cacti的snmpd配置
查看>>
#iptables实践# 之 工具介绍
查看>>
技术网站 -- centos
查看>>
Python字符串的encode与decode
查看>>
正则表达式(1)
查看>>
linux nginx编译安装以及虚拟主机的配置
查看>>
5、DNS之web管理
查看>>
mysql五:索引原理与慢查询优化
查看>>
PHP_009 表单验证
查看>>
PHP_012 Cookies和Sessions
查看>>
找出一组数中只出现一次的两个数,其他所有数都是成对出现的
查看>>
OC高效率52之总是为第三方类的分类名称加前缀
查看>>
linux进程管理
查看>>
使用md5加密与解密
查看>>
学生宿舍信息查询
查看>>
ClassLoader类加载器
查看>>
nginx中的定时器事件
查看>>
实战:微信小程序支付开发具体流程
查看>>
Rancher 2.2.4发布,CVE修复,项目监控回归!
查看>>
MySQL主从复制
查看>>