简述指针数组 数组指针 函数指针 函数指针数组和函数指针数组的指针
来源:互联网 发布:ext3 windows 编辑:程序博客网 时间:2024/05/17 23:51
(1)指针数组:实际上是一个数组,只不过数组内存放的是指针,我们把它叫做指针数组;
由于它是一个数组,它是不能从堆空间里申请空间的。 只能做个循环,每个元素去申请空间,或者每个元素去指向另外的地址空间。
例如:int *arr[10] //这是一个一维指针数组;
具体用法如下:
int main(){ //定义两个指针 char *a = "hello"; char *b = "bit"; //定义一个指针数组 char *arr[2]; arr[0] = a; arr[1] = b; for (int i = 0; i < 2; i++) { printf("%s ",arr[i]); } printf("\n"); return 0;}
(2)数组指针:一个指向一维或者多维数组的指针
例如:int(*p)[10];//指向一维数组的指针
int main(){ int arr[10] = { 0 }; printf("%p\n", arr); printf("%p\n", arr + 1); printf("%p\n", &arr); printf("%p\n", &arr + 1); return 0;}
从上面的结果中可以看出:arr+1 加上了一个元素大小, 而&arr+1 加上了整个数组的大小,这是为什么呢?这是因为arr表示的是数组首元素的地址,而&arr表示的是数组的地址;数组的地址和数组首元素的地址是相同的,但表示的意义不同。
数组指针的简单用法:
int main(){int arr[10]={0};int (*p)[10]=&arr;//正确;int (*p)[11]=&arr;//错误;}
(3)函数指针:顾名思义,指向函数的指针;
C在编译时,每一个函数都有一个入口地址,该入口地址就是函数指针所指向的地址。有了指向函数的指针变量后,可用该指针变量调用函数,就如同用指针变量可引用其他类型变量一样,在这些概念上是大体一致的。函数指针有两个用途:调用函数和做函数的参数。
函数指针的声明方法:
type (*func)(type &,type &)
该语句声明了一个指针func,它指向了一个函数,这个函数带有了2个type型参数并返回一个type的值。
p.s. type类型可以被看成是int或者是float等C的类型。
函数指针应用示例:
1)调用函数
void(*FunP)(int); //也可申明成void(*FunP)(int x),但习惯上一般不这样。void MyFun(int x) //这里定义一个MyFun函数{ printf("%d\n", x);}int main(int argc, char* argv[]){ MyFun(10); //这是直接调用MyFun函数 FunP = &MyFun; //将MyFun函数的地址赋给FunP变量 (*FunP)(20); //这是通过函数指针变量FunP来调用MyFun函数的。}
2)做函数的参数
void MyFun1(int x);void MyFun2(int x);void MyFun3(int x);typedef void(*FunType)(int); // 定义一个函数指针类型FunType,与MyFun1函数类型一致 void CallMyFun(FunType fp, int x);int main(){ CallMyFun(MyFun1, 10); // 通过CallMyFun函数分别调用三个不同的函数 CallMyFun(MyFun2, 20); CallMyFun(MyFun3, 30);}void CallMyFun(FunType fp, int x) //参数fp的类型是FunType。{ fp(x); // 通过fp的指针执行传递进来的函数,注意fp所指的函数是有一个参数的。}void MyFun1(int x) // 这是个有一个参数的函数,以下两个函数也相同。 { printf("函数MyFun1中输出:%d\n", x);}void MyFun2(int x){ printf("函数MyFun2中输出:%d\n", x);}void MyFun3(int x){ printf("函数MyFun3中输出:%d\n", x);}
(4)函数指针数组:就是存储函数指针的数组
函数指针数组的定义:
type (*parr[10])(type &) //参数可多个;
函数指针数组的使用:
int add1(int a1,int b1);int add2(int a2,int b2);int main(){ int numa1=1,numb1=2; int numa2=2,numb2=3; int (*op[2])(int a,int b); op[0]=add1; op[1]=add2; printf("%d %d\n",op[0](numa1,numb1),op[1](numa2,numb2)); system("pause"); return 0;}int add1(int a1,int b1){ return a1+b1;}int add2(int a2,int b2){ return a2+b2;}
(5)函数指针数组的指针:
函数指针就够一般初学者折腾了,函数指针数组就更加麻烦,现在的函数指针数组指针就更难理解了。
其实,没这么复杂。前面详细讨论过数组指针的问题,这里的函数指针数组指针不就是
一个指针嘛。只不过这个指针指向一个数组,这个数组里面存的都是指向函数的指针。仅
此而已。
简单定义:
type *(*(*pf)[3])(type *p);
下面举个栗子解释一下:
char * fun1(char * p){printf("%s\n",p);return p;}char * fun2(char * p){printf("%s\n",p);return p;}char * fun3(char * p){printf("%s\n",p);return p;}int main(){ char * (*a[3])(char * p);char * (*(*pf)[3])(char * p);pf = &a;a[0] = fun1;a[1] = &fun2;a[2] = &fun3;pf[0][0]("fun1");pf[0][1]("fun2");pf[0][2]("fun3");return 0;}
这里的pf 确实是实实在在的指针。这个指针指向一个包含了3 个元素的数组;这个数字里
面存的是指向函数的指针;这些指针指向一些返回值类型为指向字符的指针、参数为一个
指向字符的指针的函数。这比上面的函数指针数组更拗口。其实你不用管这么多,明白
这是一个指针就ok 了。
- 简述指针数组 数组指针 函数指针 函数指针数组和函数指针数组的指针
- 数组指针、 指针数组、函数指针、函数指针数组和指向函数指针数组的指针
- 指针函数、数组指针、函数指针、函数指针数组和指向函数指针数组的指针
- 函数指针,指针数组和数组指针
- 数组指针,指针数组和函数指针
- 指针,指针数组,数组指针,函数指针
- 函数指针指针数组
- 数组指针、函数指针
- 指针&数组&函数指针
- 函数指针数组指针!
- 函数指针,函数指针数组,函数指针数组的指针
- 函数指针,函数指针数组,函数指针数组的指针
- 函数指针,函数指针数组,函数指针数组的指针
- 函数指针、函数指针数组,函数指针数组的指针
- 函数指针和指针函数 数组指针和指针数组
- 数组指针和指针数组,函数指针和指针函数
- 指针函数和函数指针、指针数组和数组指针
- 指针函数和函数指针、指针数组和数组指针
- css实现垂直水平居中的5种方法
- D
- 031 矩阵关系专题之等价、相似、合同(线性代数系列结束)
- Gephi初识之简单绘图学习
- 分布式session跨域的两种实现方式
- 简述指针数组 数组指针 函数指针 函数指针数组和函数指针数组的指针
- Leetcode 67. Add Binary
- yum初识
- ROS下遇到.gvfs删不掉及激光雷达连不上电脑问题的解决办法
- 指针及其指针的使用
- 连续序列 最大乘积解题报告
- c++中的const与指针
- Merge、ViewStub标签总结
- HDU5285:wyh2000 and pupil(二分图染色 & 贪心)