我是靠谱客的博主 多情冰棍,这篇文章主要介绍指针进阶3 函数指针,现在分享给大家,希望可以做个参考。

1 *指针进阶

  • **
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
int main () { /*用这总情况定义v字符串时 **创建在rodate 段**,在该段**只 能读**,**不能修改**;若要修改只能定义在数组中;*/ char * p1="hello"; char * p1="hello"; if( p1==p2) printf(" hello"); return 0;

}
*在数组中定义相同的字符串时 他开辟地址不一样、
**

2 指针数组**

复制代码
1
2
3
**指针数组是一个数组,内部存指针` eg ;int *p a[10];

3 .数组指针

(**一般用来表示二维以上的数组,**内部存一维数组的地址
**数组指针是指针 ,又叫指向数组的指针
类比指向整型数据的指针;
eg: int a[10]={0};
int (*p)[10]=&a;
跟指针数组的区别 ;( * )的优先级

***** 数组名 和&数组名*****
arr 与 &arr[0];

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
&arr = 整个数 组(整个数组的地址) 跟 arr 区别 :虽然地址值一样,但他俩类型不一样,表示的意义也不一样 arr+1相当于arr[1]; &arrr+1 指向数组末尾地址的最后边 &arr + n 就是在原数组的基础上 + n个该数组的长度
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
在这里插入代码片 ```#define _CRT_SECURE_NO_WARNINGS 1 #include"stdio.h" #include"windows.h" void main () { int a[10]={12,3,4}; printf("%dn",a); printf("%dn",&a); printf("%dn",&a+1); printf("%dn",&a+2); printf("%dn",&a+4); system("Pause");在这里插入代码片 } ![在这里插入图片描述](https://img-blog.csdnimg.cn/20191008204649262.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDAzMDU4MA==,size_16,color_FFFFFF,t_70) ```clike 在这里插入代码片
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
**数组名在两种情况下代表整个数组 1 sizeof(arr) 2 &arr ** 数组指针如何访问数组元素 一般一维数组不要写成数组指针; 真正使用放在二维数组传参 eg: int arr[4][3]={0,1,2,3,4,5,6,7,8,9};

·· 将参数写成一维数组指针;(因为数组指针内存数组的地址,此处将一维数组看成一个地址(元素)),换句话说,二维数组将一维数组看成了元素,把自己看成了一维数组。
接受用 Show(int (*p)[3]);

复制代码
1
2
3
4
5
6
7
8
9
10
***即将 a[i][j]写成 *(*(a+i)+j)***; 这样写相当于内部为 二级指针 ,外边是一级指针, 指针数组 是个数组 内部存(指针)变量的地址; 数组指针 是个数组 内部存(指针)一维数组的地址

复制代码
1
2
3
4
5
6
7
**将二维数组***强转***为一维数组时可以通过一维数组方式(i * col +j)访问存储; 一级指针可以接收一维数组;也可以接受变量的地址 二级指针可以接收一级指针的地址 eg; char a =0x1234; char *p =&a; char ** p2 =&p;

3 函数指针

** (**指向函数的指针,即实质为指针)
eg : void (*p) test();
即 返回值类型 + 指针名 + 函数名 +调用符号();

类比数组指针 void(返回值是什么类型左边就是对应类型的 (*p ) void (*p) () = test(函数名)
1 函数名代表函数的地址

复制代码
1
2
3
4
5
6
(*( void (*)() )0) () 调用 0(内存地址)地址处的 不带有参数的 返回值为 void 的函数

最后边的() 为调用函数的功能 里面的()表示不带有参数
0表示内存地址在哪(实际情况是0地址为保留区)

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void ( * signal( int , void(*) (int) ) ) (int ) 一个signal 函数 参数为 (int , void(*) (int)) , 它的返回值 为 函数指针 void (*) (int);

4函数指针数组 : int (*arr[2]) ()

是个数组,存 函数指针
用途 :转移表 ( 就是后边的加减乘除程序)

5

指向 函数指针数组的指针

(是个指针 ,指向函数指针数组)
eg: void(*(*p)[2] ) ();

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> int main() { //int *p a[2]指针数组 //int (*P)[10];数组指针 //指向 函数指针数组 的 指针 void (*p1) (); //函数指针 void (*p2[5])(); //函数指针数组 void ( * (*p3)[5]) (); //p3是一个指针 指向一个数组 长度为5 //数组里面放的是 void (*) (); 函数指针 return 0; }

6用函数指针数组封装一个函数

好处代码冗余度大大降低

复制代码
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
```clike #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #if 0 int add(int a, int b) { return a + b; } int sub(int a, int b) { return a - b; } int mul(int a, int b) { return a*b; } int div(int a, int b) { return a / b; } int main() { int input = 1; int x = 0; int y = 0; int ret = 0; int (*p[5])(int ,int) = {0,add,sub,mul,div}; //p:函数指针数组 数组长度为5 // int (*) (int,int); while(input) { printf("*******************************n"); printf("*****1.add********2.sub*******n"); printf("*****3.mul********4.dev********n"); printf("*********************************n"); printf("请输入你的操作:"); scanf("%d",&input); if(input >= 1 && input <= 4) { printf("请输入两个操作数:"); scanf("%d%d",&x,&y); ret = (*p[input]) (x,y);//利用函数指针数组 printf("ret = %dn",ret); } } return 0; }
复制代码
1
2

最后

以上就是多情冰棍最近收集整理的关于指针进阶3 函数指针的全部内容,更多相关指针进阶3内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(90)

评论列表共有 0 条评论

立即
投稿
返回
顶部