概述
1 *指针进阶
- **
int main ()
{
/*用这总情况定义v字符串时
**创建在rodate 段**,在该段**只
能读**,**不能修改**;若要修改只能定义在数组中;*/
char * p1="hello";
char * p1="hello";
if( p1==p2)
printf(" hello");
return 0;
}
*在数组中定义相同的字符串时 他开辟地址不一样、
**
2 指针数组**
**指针数组是一个数组,内部存指针`
eg ;int *p a[10];
3 .数组指针
(**一般用来表示二维以上的数组,**内部存一维数组的地址)
**数组指针是指针 ,又叫指向数组的指针,
类比指向整型数据的指针;
eg: int a[10]={0};
int (*p)[10]=&a;
跟指针数组的区别 ;( * )的优先级
***** 数组名 和&数组名*****
arr 与 &arr[0];
&arr = 整个数 组(整个数组的地址)
跟 arr
区别 :虽然地址值一样,但他俩类型不一样,表示的意义也不一样
arr+1相当于arr[1];
&arrr+1
指向数组末尾地址的最后边
&arr + n
就是在原数组的基础上
+
n个该数组的长度
在这里插入代码片
```#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
sizeof(arr)
2
&arr
**
数组指针如何访问数组元素
一般一维数组不要写成数组指针;
真正使用放在二维数组传参
eg:
int arr[4][3]={0,1,2,3,4,5,6,7,8,9};
·· 将参数写成一维数组指针;(因为数组指针内存数组的地址,此处将一维数组看成一个地址(元素)),换句话说,二维数组将一维数组看成了元素,把自己看成了一维数组。
接受用 Show(int (*p)[3]);
***即将
a[i][j]写成
*(*(a+i)+j)***;
这样写相当于内部为 二级指针 ,外边是一级指针,
指针数组
是个数组 内部存(指针)变量的地址;
数组指针
是个数组
内部存(指针)一维数组的地址
**将二维数组***强转***为一维数组时可以通过一维数组方式(i * col +j)访问存储;
一级指针可以接收一维数组;也可以接受变量的地址
二级指针可以接收一级指针的地址
eg; char a =0x1234;
char *p =&a;
char ** p2 =&p;
3 函数指针
** (**指向函数的指针,即实质为指针)
eg : void (*p) test();
即 返回值类型 + 指针名 + 函数名 +调用符号();
类比数组指针 void(返回值是什么类型左边就是对应类型的 (*p ) void (*p) () = test(函数名)
1 函数名代表函数的地址
(*( void (*)() )0) ()
调用 0(内存地址)地址处的
不带有参数的
返回值为 void 的函数
最后边的() 为调用函数的功能 里面的()表示不带有参数
0表示内存地址在哪(实际情况是0地址为保留区)
void ( * signal(
int ,
void(*)
(int)
)
)
(int )
一个signal 函数 参数为 (int
, void(*)
(int))
,
它的返回值 为 函数指针 void (*) (int);
4函数指针数组 : int (*arr[2]) ()
是个数组,存 函数指针
用途 :转移表 ( 就是后边的加减乘除程序)
5
指向 函数指针数组的指针
(是个指针 ,指向函数指针数组)
eg: void(*(*p)[2] ) ();
#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用函数指针数组封装一个函数
好处代码冗余度大大降低
```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;
}
最后
以上就是多情冰棍为你收集整理的指针进阶3 函数指针的全部内容,希望文章能够帮你解决指针进阶3 函数指针所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复