当前位置: 首页 > news >正文

ubuntu 做网站 分区视频号的链接在哪

ubuntu 做网站 分区,视频号的链接在哪,wordpress 微信采集器,包头做网站1.指针数组 指针数组表较简单,类比整型数组,字符数组,整型数组里面的元素都是整型变量,字符数组里面 的元素是字符类型,那么指针数组就是数组里面的每个元素都是指针类型,例如int*arr[5]就是一个 指针数…

1.指针数组

指针数组表较简单,类比整型数组,字符数组,整型数组里面的元素都是整型变量,字符数组里面

的元素是字符类型,那么指针数组就是数组里面的每个元素都是指针类型,例如int*arr[5]就是一个

指针数组,数组里面的元素都是int*的指针类型;

2.数组指针

数组指针是什么,如何使用,我们回忆一下二维数组传参,我们知道一维数组的传参,例test函数

test(arr)参数arr是数组名,就是数组首个元素的地址,我们也可以使用数组接受,也可以使用指针

指向首个元素的地址,通过指针的移动打印数组的元素;

同理,二维数组传参,例如arr[3][5],传递参数test(arr),arr是二维数组的名字,但是不是设个元素的

地址,而是首行元素的地址,这个时候如果想要使用指针接受,这个指针就应该是数组指针,指向

的是一个数组,还是拿这个3行5列数组举例,对于二维数组我们可以这样理解,把二维数组理解成

3个一维数组,实际上传递进去的是第一行以为数组的地址,有5个元素,我们使用数组指针

int(*p)[5]进行接收,这个数组指针表示指向5个元素,每个元素的类型是int类型,数组指针的名字

是p指针,指针类型int(*)[5],指针的类型决定了对指针进行加一操作会跳过几个字节,如果是普通的

整形指针数组,加一就跳过4个字节,但是这里的p指针的类型是int(*)p,所以加一会跳过5个元素,

也就是20字节。

3.函数指针变量

我们知道数组名表示 数组首个元素的地址,函数名同样表示函数的地址,取地址数组名表示整个

数组的地址,但是取地址函数名仍然是函数的地址,和直接的函数名没有区别

图片里面int (*p)(int,int)就是定义函数指针,这个函数指针的参数有2个,都是int类型

这个函数的返回类型是int类型,实际上在进行调用的时候,加上星号只是为了表示他是函数指针

加上2个或者多个星号都不影响使用,不加星号都是可以的,通过打印结果也可以知道,

看似,即使没有函数指针,我们也可以对函数进行使用,实际上后续函数指针会发挥巨大作用

4.二段有趣的代码分析

1 (*(void (*)())0)();

这个里面的void(*)()是函数指针类型,放在括号里面就是进行强制类型转换,把0转换成函数指针类

型,0是个地址,这里的星号同上,是可以省略的,调用0地址处的这个函数,(这里面的0仅仅是一

个地址)这个函数指针没有参数,传递的参数也是空的,如果要调用100地址处的函数,就是

100,总言之,这是一次函数的调用;

2.void (*signal(int , void(*)(int)))(int);

这个里面的void(*)(int)也是函数指针变量,参数int类型,返回void类型,signal是一个函数,函

数的参数是int类型,和函数指针类型,去掉后是void(*)(int)还是一个函数指针类型,也就是这个函

数的返回值是函数指针类型,函数的声明只需要高数参数的类型,可以不写名字,可能初学者会问

可不可以写为void(*)(int)  signal(int,void(*)(int),或许这样写更加清楚,但是编译器不支持;实质上

这个是函数的声明;

5.typedef关键字的使用

上面的这个例子,对于比较长的数据类型或者指针类型,名字我们可以进行简化,这个时候就有了

typedef关键字

typedef unsigned int  ptr就是把unsigned int这个比较长的类型用ptr代替

我们定义unsigned int a=10;就可以直接写为ptr a=10,使得原来复杂代码简单化,就是重新起名字

还例如指针类型也可以进行简化,int*类型也可以这样简化,typedef int* asd,就是简化后名字asd

int(*p)[5]是数组指针,类型int(*)[5],也可以重新命名,不是int(*)[5] ptr,需要写为typedef int(*ptr)[5]

ptr也是一种类型了,平时的int(*p2)[5]=&arr(这里的p2就是指针变量)就可以写为ptr p2=&arr,

函数指针类型重命名,原来的 void (*pf)(int)函数指针,typedef  void(*)(int)  ptr;以后定义就可以

写作ptr p2=&add,这样定义函数指针类型;

同样使用ptr重命名函数指针,void (*signal(int , void(*)(int)))(int);就可以简化为

ptr signal(int,ptr),变得更加简单,简洁高效。

typrdef  int* ptr;就是关键字重命名;

#define int* PTR就是遇到PTR使用int*替代,ptr a相当于int*a,这样也可以简化;

第一一个变量的时候两者无区别,定义2个时候就有区别

ptr  a,b;可以同时定义a,b都是int*类型

PTR a,b;不能同时定义a,b是int*类型,只能定义a ,b还是默认的int 类型;

由此可见,使用重命名的时候,尽量使用typedef,使用#define可能会出现问题。

6,函数指针数组

(1)首先讲一下函数指针数组如何使用:

每一个运算的法则都是函数指针,因为他们的参数,返回类型都是相同的,所以我们可以放到

一个数组里面,这个数组就叫做函数指针数组,循环里面直接调用就可以了;

函数指针数组就是在函数指针名字后面加上元素个数;

(2)接下来讲一下函数指针数组如何使用:以一个计算机的构建为例,这个计算机可以实现

简单的四则运算;下面是自定义函数和主函数的代码

下面的是函数

int add(int x, int y)
{return x + y;
}
int sub(int x, int y)
{return x - y;
}
int mul(int x, int y)
{return x * y;
}
int divi(int x, int y)
{return x / y;
}

下面主函数(注意除法的自定义函数不能直接使用div,本人亲测,div和库函数里面的div冲突)

void menu()
{printf("*****************************************\n");printf("**********1.add**************************\n");printf("**********2.sub**************************\n");printf("**********3.mul**************************\n");printf("**********4.divi**************************\n");printf("**********0.exit*************************\n");
}
int main()
{int input = 0;int x = 0;int y = 0;int ret = 0;do {menu();printf("请选择\n");scanf("%d", &input);switch (input){case 1:printf("请输入2个数字\n");scanf("%d %d", &x, &y);ret = add(x, y);printf("%d\n", ret);break;case 2:printf("请输入2个数字\n");scanf("%d %d", &x, &y);ret = sub(x, y);printf("%d\n", ret);break;case 3:printf("请输入2个数字\n");scanf("%d %d", &x, &y);ret = mul(x, y);printf("%d\n", ret);break;case 4:printf("请输入2个数字\n");scanf("%d %d", &x, &y);ret = divi(x, y);printf("%d\n", ret);break;case 0:printf("退出计算器");break;default:printf("请重新选择\n");break;}} while (input);return 0;
}

思考分析简化:

 这个是一个普通的计算器,只有加减乘除法则运算;

这样看来,每个case都要重复,显示的有些冗余,这个时候可以使用函数指针数组;

int main()
{int input = 0;int x = 0;int y = 0;int ret = 0;int(*ptr[5])(int,int) = {NULL,add,sub,mul,divi};do{menu();printf("请选择\n");scanf("%d", &input);if (input >= 1 && input <= 4){printf("请输入2个数字\n");scanf("%d %d", &x, &y);ret = ptr[input](x, y);printf("%d\n", ret);}else if (input == 0){printf("退出计算器\n");break;}else{printf("选择错误,重新选择\n");}} while (input);return 0;
}

这个时候,引入数组,里面就是函数,因为要使我们输入的input和数组元素的下标相对应,

所以我们把第一个元素设置为NULL,这样我们选择哪个数字,就可以找到对应函数地址,使用这个

函数,这样函数的下标就是1,2,3,4了;ptr[input]直接找到对应的地址,使用这个函数

而且,如果想要增加法则,只需要增加数组元素就可以了,如果不是用这种数组,就需要

增加case语句,里面的内容还是需要重复,更加复杂,函数指针数组的优势就体现了出来。

http://www.yidumall.com/news/10512.html

相关文章:

  • 杭州做网站的优质公司哪家好网站外链是什么意思
  • 做分销网站系统昆明seo技术培训
  • 太原网站建设网格未来百度怎么精准搜关键词
  • 丝绸之路网站建设报告百度平台推广
  • ipv6跟做网站有关吗网站营销网站营销推广
  • 做网站的案例手机网站模板建站
  • 重庆欧勒精细陶瓷有限公司网站策划书soe搜索优化
  • 做翻译赚钱的网站好百度升级最新版本下载安装
  • 深圳布吉网站建设百度推广按效果付费是多少钱
  • 找美工做网站多少钱怎么开网站平台挣钱
  • 淘宝不能开网站建设店铺吗什么软件可以刷网站排名
  • 模板网站免费下载正规seo多少钱
  • 如何进行网站管理免费发布信息的平台有哪些
  • 网站推广好不好百度seo服务
  • 做游戏CG分享的网站网络游戏推广公司
  • 郑州北环网站建设培训如何快速提升自己
  • 网站后台管理系统 asp代写
  • 帮别人做钓鱼网站 公安淘宝推广费用多少钱一天
  • 商城网站开发费用青岛网站建设技术外包
  • 漫画风格网站志鸿优化设计
  • 电子商务网站建设开发文档seo sem是指什么意思
  • 昆山专业网站建设公司企业查询网站
  • 有做网站看病的吗怎么进行网站推广
  • 睢县做网站的公司今天最新新闻国内大事件
  • 网站建设预估费用病毒什么时候才能消失
  • 朔城网站制作在线识别图片找原图
  • 快站怎么搭建淘客链接百度的seo排名怎么刷
  • 做网站一定要买服务器么优化大师官网
  • 网站建设时送的ppt方案如何优化网页
  • 汕头市建设信息网成都seo培