一、二级指针
1、二级指针是指向指针的指针。一个二级指针变量存储的是一个一级指针的地址,即它指向一个一级指针;
2、对二级指针变量进行一次间接访问就是访问该二级指针变量指向的那个一级指针。如果对二级指针的间接访问作为左值,则访问的是一级指针的内存地址,即会改变一级指针的指向;如果对二级指针的间接访问作为右值,则访问的是一级指针变量存储的地址值,即一级指针指向的地址;
3、对二级指针进行两次间接访问就是访问首先访问该二级指针变量指向的一级指针,然后继续访问该一级指针指向的地址。如果对二级指针的两次间接访问作为左值,则访问的是它指向的那个一级指针指向的内存地址,即会改变其存储的内容;如果作为右值,则访问的是一级指针指向的内存地址的内容。
二、高级指针
1、int *( * f [ ] ) ( int ); // f 是函数指针数组,每个函数的参数是一个int型整数,并且返回值是一个指向整型的指针
2、int (* ( * f )( ) )[ ]; // f 是一个函数指针,它指向的函数的返回值又是一个指针,该返回的指针指向一个数组;
3、 int ( * ( * f )[ ]) ( ) // f 是一个指向数组的指针,该数组指针的返回值是函数指针。个人认为该声明方式可以实现二维函数指针数组。
三、函数指针
1、对一个函数指针赋值时,可以对被赋值的函数名加 &,也可以不加;例如先声明一个函数int f ( int ) ; 再声明一个函数指针,int ( *pf ) ( int ) = f ,也可以是int ( *pf ) ( int ) = &f;
2、函数的三种调用方式:
1) result = f ( value ); 2) result = ( * pf ) ( value ) ;3) result = pf ( value );
3、函数的调用过程:
在1)中,直接用函数名调用,但是编译器会首先将函数名转换为函数指针,然后通过函数操作符(就是括号)去访问函数指针指向的地址;
在2)中,通过对函数指针的间接访问调用函数,对函数指针pf进行间接访问的结果就是函数名f,所以2)的结果和1)一样,并且最终最后还是会转换成函数指针;
在3)中,一步到位,2)中的间接访问并不是必需的, 因为编译器需要的是一个函数指针。
四、函数指针的适用场合
1、回调函数: 如果你所编写的函数必须能够在不同的情况下可以执行不同类型的工作,或者执行只能由函数调用者定义的工作,可以用回调函数;
2、转移表: 其实就是函数指针数组,将不同的情况转换为整型值,让其作为函数指针数组的下标来控制访问不同的函数。使用转移表时必须要注意的一点是要保证数组不越界,也就是说在使用下标之前要判断下标有效性。
五 命令行参数的处理 , argc和argv
六 字符串常量
以上为第13章 “使用结构体”一章, 未完待续。。。