高级指针

《C与指针》读书笔记
1.进一步探讨指向指针的指针
int i;
int *pi = &i;
int **ppi = π
它们在内存中的表示如下:

pi是int*类型的指针,指向i。ppi是int**类型的指针,指向pi。
2. 高级声明
从简单的声明开始,由浅及深了解高级声明。
(1)int f;
一个整形变量。
(2)int *f;
一个指向整形的指针。
(3)int f();
f是一个函数,返回值是一个整数。
(4)int *f();
要推断出它的含义,你必须确定表达式*f()是如何进行求值的。首先执行的是函数调用操作符(),因为它的优先级别高于间接访问操作符。因此f是一个函数,它的返回值类型是一个指向整型的指针。
(5)int (*f)();
先看*f,f是一个指针。后面接着是函数操作符,所以指针指向一个函数,返回值是一个整型。所以f是一个函数指针,它所指向的函数返回一个整型值。
(6)int *(*f)();
跟上面差不多,只不过返回值类型为int*。f是一个函数指针,它所指向的函数返回一个整型指针。
(7)int f[];
f是一个整型数组。
(8)int *f[];
f是一个数组,它的元素是整型指针。
(9)int f()[];
非法。它表明函数返回值是一个数组,这是非法的。
(10)int f[]();
非法。它表民数组的元素是函数。但是函数的长度是不一样的。
(11)int (*f[])();
先执行[],f是一个数组。执行*,数组的元素是指针。执行()。指针指向一个返回值为int的函数。所以,f是一个数组,数组的元素是返回值类型为int的函数指针。
(12)int *(*f[])();
跟上面差不多。f是一个数组,数组的元素是返回值类型为int*的函数指针。
(13)
int (*f)(int,float);
int *(*g[])(int,float);
f是一个指针,它所指向的函数接受两个参数,分别为int类型和float类型。
g是一个数组,数组的元素是一个函数指针,它所指向的函数接受两个参数,分别是int和float。
3.函数指针
3.1 回调函数
在一个单链表中查找一个值。要使查找函数通用,必须让查找函数与类型无关。这个时候可以使用回调函数。下面是查找函数:
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类型。编写比较函数如下
int
compare_ints(void const *a,void const *b){
if(*(int *)a == *(int *)b)
return 0;
else
return 1;
}
这个函数像下面这样使用:
desired_node = search_list(root,&desired_value,compare_ints);
3.2 转移表
转移表最好用个例子来解释。如何实现一个袖珍式计算机。
把具体操作和选择操作的代码分开是一种良好的设计方案。更为复杂的操作将肯定以独立的函数来实现。这个时候使用转换表,转换表就是一个函数指针数组。
创建一个装换表需要两个步骤。首先,声明并初始化一个函数指针数组。
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,...
};
第2个步骤,使用下面语句计算结果。
result = oper_func[oper](op1,op2);
oper从数组中选择正确的函数指针,而函数调用操作符将执行这个函数。
4. 命令行参数
C程序的main函数具有两个形参。第一个通常称为argc,它表示命令行参数的数目。第二个通常称为argv,它指向一组参数值。这些元素每一个都是指向一个参数文本的指针。
int main(int argc,char **argv);
5. 字符串常量
当一个字符串常量出现在表达式中时,它的值是一个指针常量。编译器把这些指定字符的一份拷贝存储在内存的某个位置。并存储一个指向第一个字符的指针。
下面这个表达式是什么意思?
"xyz" + 1
当你记得字符串常量实际上是一个指针时,它的意义就变得清楚了。这个表达式计算“指针值加上1”的值。它的结果是一个指针,指向字符串中的第二个字符:y。
*"xyz"
这个间接访问的结果就是它所指向的字符:x。
"xyz"[2]
使用下标访问到字符z。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值