c和指针13

高级指针

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
int *f();
// //*f()是如何求值的,首先执行的是函数调用操作(因为()优先级高于*),因此 f 是一个返回值为指向整型的指针的函数
// //用于声明比那辆的表达式和普通的表达式在求值所使用的规则相同
int (*f)();
// //f 成为一个函数指针,这个函数返回一个 int 类型
int *(*f)();
// //f 成为一个函数指针,这个函数返回一个 int* 类型
//


//// int f[10];
//
//// int f[];
//
// //如果链接属性时 external 或者是作用函数的参数,即使它们在声明时未注明长度,也是合法的



//// int *f[10];
// //[]的优先级高, f 是一个数组,里面存着 int*
//// int f()[10];
// //f是一个函数,返回值是int数组 错误!返回值只能是标量值

//// int f[10]();
// //f是一个数组,元素类型是返回值为 int 类型的函数 错误!数组元素必须具有相同的长度,但不同的函数显然可能具有不同的长度
//// int (*f[10])();
// //左括号----- f 是一个元素为某种类型的指针的数组 元素的类型是函数指针,它指向的函数的返回值是 int 类型
//// int *(*f[])();
// //左括号----- f 是一个元素为某种类型的指针的数组 元素的类型是函数指针,它指向的函数的返回值是 int* 类型
//


////函数指针最常用的两个用途是转换表和作为参数传递给另一个函数
//
////!!!简单声明一个函数指针并不意味着它马上就可以使用.和其它指针一样,对函数指针执行间接访问之前必须把它初始化为指向某个函数
////int f(int);
////int (*pf)(int) = &f;
// //在函数指针初始化之前具有 f 的原型是很重要的
// //int (*pf)(int) = &f;中的&可以省略,因为函数名被使用时总是由编译器把它转换成函数指针
//
//
// printf("Hello, World!\n");
// return 0;
//}

//查找
//#include <stdio.h>
//#include <node.h>
//Node *
//search_list (Node * node void const * value,
//int (*compare) (void const *,void const *)){
// while (node != NULL){
// if (compare(&node->value,value) == 0){
// break;
// }
// node = node->link;
// }
// return node;
//}
////和类型无关的查找
//int
//compare_ints(void const *a,void const *b){
// if (*(int *)a == *(int *)b){
// return 0;
// } else{
// return 1;
// }
//}

//转换表

//把具体操作和选择操作分开是一种良好的设计方案


//double add(double,double);
//double sub(double,double);
//double mul(double,double);
//double div(double,double);
//double (*oper_func[])(double, double) = {
// add,sub,mul,div,
//};
//result = oper_func[oper](op1,op2);

//如果你怀疑转移表有问题,可以在那个函数调用之前和之后各打印一条信息.如果被调用函数不返回,人们很难认识到程序某个部分的失败可以是位于程序中相隔甚远的且不相关部分的一个转移表错误所引起的.
//保证转移表所使用的下标位于合法的范围!


//字符串常量出现于表达式中时,它的值是一个指针常量
//"xyz"+1;结果是个指针,指向字符串中的第二个字符 y