概念
数组指针
就是指向数组的指针,它表示的是一个指针,它指向的是一个数组,它的重点是指针,如,int(*pa)[8]声明了一个指针,该指针指向了一个有8个int型元素的数组
指针数组
就是指针的数组,表示的是一个数组,它包含的元素是指针,它的重点是数组。如, int* pa[8]声明了一个数组,该数组的每一个元素都是int型的指针
函数指针
是指向函数的指针变量,即重点是一个指针。
格式:类型说明符 (*函数名)(参数)
int (*f) (int x);
指向函数的指针包含了函数的地址,可以通过它来调用函数,其实这里不能称为函数名,应该叫做指针的变量名。这个特殊的指针指向一个返回整型值的函数实现地址。指针的声明笔削和它指向函数的声明保持一致。
指针函数
就是指针的函数,表示是一个函数,函数返回类型是某一类型的指针
格式: 类型标识符 *函数名(参数表)。
int *f(x,y);
注释:
函数名并不是函数地址的代表,这种误解与数组名就是指针一样犯了相同的错误。函数名是函数实体的代表,不是地址的代表,当然,你马上就会有疑问,平时我们不都是把函数名作为函数的地址吗?是的,我可以告诉你,函数名可以作为函数的地址,但是,绝大多数人都忽略了一个条件,从函数到指针的隐式转换是函数名在表达式中的行为,就是说,这个转换仅在表达式中才会发生,这仅是函数名众多性质中的一个,而非本质,函数名的本质就是函数实体的代表。
到了C++,由于C++规定,非静态成员函数的左值不可获得,因此非静态成员函数不存在隐式左值转换,即不存在像常规函数那样的从函数到指针的隐式转换,所以必须在非静态成员函数前使用&操作符才能获得地址。
先看函数指针
int func2(int x); /* 声明一个函数 */
int (q2) (int x); / 声明一个函数指针 /
q2=func2; / 将func函数的首地址赋给指针f */
int c=(*q2)(3); //3可以为任意实参
上面4句基本说明了函数指针的用法:
函数指针是指向函数的指针,确切的说,是指向特定类型函数的指针(函数与函数指针类型要匹配)
函数指针用来保存函数首地址,即可以通过该指针访问函数。函数指针相当于取别名。
函数指针可以指向一类函数,而不是一个函数,即可以重新赋值。(见例2)
例1:
#include<stdio.h>
int max(int x,int y){ return(x>y?x:y); }
void main()
{
int (*ptr)(int, int);
int a,b,c;
ptr=max;
scanf("%d%d",&a,&b);
c=(*ptr)(a,b);
printf("a=%d,b=%d,max=%d",a,b,c);
}
例2:
#include<stdio.h>
void FileFunc()
{
printf("FileFunc\n");
}
void EditFunc()
{
printf("EditFunc\n");
}
void main()
{
typedef void (*funcp)();
funcp pfun= FileFunc;
pfun();
pfun = EditFunc;
pfun();
}
再看指针函数:
int func(int x);/ 声明一个指针函数 */
int q; / 声明一个指针 */
q=func(3);//3可以为任意实参
上面三句基本说明了指针函数:
指针函数是返回值为指针的函数,所以我们在main()中调用它时可以用一个同类型的指针来接收。
指针函数可以用来解决众多问题,如返回多个值的问题。(见"函数返回多个值的方法"那篇文章)
指针函数比经常更经常用到,一定要学会用
指针函数逻辑简单,结构清新,功能强大,质量好,效率高,堪比极品中的凤姐,胜过。。。(求下联),反正不学会真是损失。
例3也是百度来的,个人觉得很经典,涉及到了指针,数组指针,指针函数,二维数组的赋值,函数返回多个值,数组指针的自增与指针自增的区别。。。众多知识。看懂这个基本指针这一块差不多了。
例3:
#include<iostream>
using namespace std;
int main()
{
float *find(float (*p)[4],int m);//查询序号为m的学生的四门课程的成绩
float score[][4]={{50,51,52,55},{70,70,40,80},{77,99,88,67}};//定义成绩数组,第一维可以为变量
float *pf=NULL;//定义一个指针时一定要初始化
int i,m;
//cout<<"请输入您想查询的学生的序号:";
cin>>m;
pf=find(score,m);//返回为一维数组指针,指向一个学生成绩
for(i=0;i<4;i++)
cout<<*(pf+i)<<" ";
cout<<endl;
return 0;
}
float *find(float (*p)[4],int m)
{
float *pf=NULL;
pf=*(p+m);//p是指向二维数组的指针,加*取一维数组的指针
return pf;
}
pf=(p+m);//p是指向二维数组的指针,加取一维数组的指针
这句很经典。