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