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

天津建设安全协会网站/淘宝标题优化网站

天津建设安全协会网站,淘宝标题优化网站,有没有可以发布需求的网站,不支持下载的视频怎么保存下来如题,本篇文章重点讲解C语言中的数组指针和函数指针。这2种指针其实都不是很常用,个人感觉使用起来代码的可读性不是很高,但是还是需要了解一下。 数组指针 数组指针,即指向数组的指针,是用来存放数组的地址的。那如…

如题,本篇文章重点讲解C语言中的数组指针和函数指针。这2种指针其实都不是很常用,个人感觉使用起来代码的可读性不是很高,但是还是需要了解一下。
数组指针&&函数指针

数组指针

数组指针,即指向数组的指针,是用来存放数组的地址的。那如何取出数组的地址呢?直接&数组名即可。如:

int arr[10] = {1,2,3,4,5,6,7,8,9,10};
&arr; // 取出数组的地址

这里的&arr,就能得到数组的地址。如果我们想把它存起来,就需要一个数组指针变量。写法如下:

int (*p)[10] = &arr;

解释一下。首先,括号是不能省略的。如果写成int *p[10],就是个指针数组了,这个数组可以存放10个整形指针变量。

括号把*和数组指针变量名p括起来,此时p会优先和*结合,就是一个指针。把(*p)去掉,剩下的int [10]就是数组的类型,表示这个数组指针变量指向的数组存储int类型的数据,容量是10。

这个数组指针类型是:把变量名p去掉后的int (*)[10]

数组指针应该如何使用呢?这里举一个二维数组传参的例子。比如,我们有一个三行五列的二维数组,请你写一个函数,使用指针来打印这个数组里的值。

int arr[3][5] = {{1,2,3,4,5}, {11,22,33,44,55}, {111,222,333,444,555}};
Print(arr, sizeof(arr)/sizeof(arr[0]), sizeof(arr[0])/sizeof(arr[0][0]));

函数Print的形参应该如何写呢?如果是用一个二维数组接收,我相信大家应该是会写的,但是如果要用指针来接收呢?这个指针是什么类型的呢?

数组传参,数组名表示首元素的地址,二维数组的首元素就是第一行!也就是说,二维数组arr的数组名表示第一行的地址,而第一行是一个含有5个int的一维数组。再换句话说,arr作为二维数组的数组名,表示的是一个含有5个int的一维数组的地址,所以需要一个数组指针来接收,这个数组指针指向一个含有5个Int的一维数组!

void Print(int (*p)[5], int r, int c)
{}

函数体实现的关键就是,如何使用数组指针p来遍历原来的二维数组arr。其实呀,既然是数组名作为参数传过来,就可以当成正常的数组那样使用,比如p[i][j]其实就表示第i行第j列的元素。在C语言中,a[i]就等价于*(a+i),所以p[i][j]就等价于*(*(p+i)+j),所以一下2种实现是等价的。

void Print(int(*p)[5], int r, int c)
{for (int i = 0; i < r; ++i){for (int j = 0; j < c; ++j){// 写法1//printf("%d ", p[i][j]);// 写法2printf("%d ", *(*(p + i) + j));}printf("\n");}
}

如果用数组指针的角度来理解*(*(p+i)+j),应该怎么想呢?p是数组第一行的地址,p+i就是数组第i行的地址,*(p+i)就拿到了数组的第i行,相当于拿到了数组第i行的数组名,也就是数组第i行第一个元素的地址。那么,*(p+i)+j就是数组第i行第j个元素的地址,*(*(p+i)+j)就是数组第i行第j个元素。

函数指针

函数指针和数组指针非常像。数组指针是指向数组的指针,函数指针则是指向函数的指针。也就是说,函数指针是用来存放函数的地址的。

如何取得函数的地址呢?有2中方法:

  1. 函数名就表示函数的地址。
  2. &函数名也表示函数的地址。

比如:

int Add(int x, int y)
{return x + y;
}

对于Add函数,Add&Add都能得到它的地址。那么,存放这个地址的函数指针应该如何写呢?

int (*p1)(int, int) = Add;
int (*p2)(int, int) = &Add;

和数组指针非常类似。用括号把*p括起来,表示p是一个指针,去掉(*p)后得到的int (int, int)就是这个指针指向的函数的类型,即参数是int, int,返回类型是int的函数。

这个函数指针类型名是:把变量名去掉后的int (*)(int, int)

使用函数指针可以调用函数,有2种调用方式:

  1. 不解引用,直接调用:p(3, 5)
  2. 解引用后再调用:(*p)(3, 5)

比如,以上的代码可以这么写:

int (*p)(int, int) = Add;
int ret1 = p(3, 5);
int ret2 = (*p)(3, 5);

其实这个解引用操作没啥用,你哪怕写int ret2 = (***************p)(3, 5);,效果和不加*是一样的。

总结

  1. 数组指针是指向数组的指针,数组指针类型由3部分构成:用括号把变量名和*括起来表示是一个指针,左边写指针指向的数组存储的元素的类型,右边用方括号表示指向的数组的容量。
  2. 函数指针是指向函数的指针,函数指针类型由3部分构成:用括号把变量名和*括起来表示是一个指针,左边写指针指向的函数的返回类型,右边用圆括号表示函数的形参列表。
  3. 这两货确实挺像。

感谢大家的阅读!

http://www.jmfq.cn/news/4761955.html

相关文章:

  • java php做网站的区别/本站3天更换一次域名yw
  • NET网站开发程序员/全国各城市疫情高峰感染进度
  • 微软网站开发工具/微信crm
  • 东港区网站制作/上海百度推广客服电话
  • 微信号管理系统/北京网站优化指导
  • 企业做网站的方案/写文章免费的软件
  • 海南智能网站建设设计/免费外链发布平台
  • 物流如何做网站/百度一下网页搜索
  • 服装如何做微商城网站建设/注册商标查询官网入口
  • 色系网站哪里有/搜索引擎优化学习
  • 抚州市建设局官方网站/如何免费推广自己的网站
  • 文字域名可以做网站/如何在百度上做免费推广
  • 陕西网站开发企业/新冠咳嗽一般要咳多少天
  • 关于网站建设的意义/推广普通话的意义30字
  • 邯郸商城型网站建设/百度发广告需要多少钱
  • 专业机票网站建设/搜索引擎费用
  • 服装网站建设目标/微商软文大全
  • 石家庄谁会搭建网站/域名查询网站
  • 和韩国做贸易的网站/seo排名优化培训怎样
  • 网站构建免费/你就知道
  • 合工大网站建设试卷/成人短期电脑培训班学费
  • 资源下载WordPress主题/魔贝课凡seo课程好吗
  • php做用户注册网站/网站建设免费
  • 上海网站建设目的/aso优化榜单
  • 做网站营销怎么去推广/网络营销模式
  • 商贸有限公司网站建设/app广告推广
  • 做seo网站优化价格/b2b电子商务平台网站
  • 用axure做网站/百度关键词购买
  • 国外做评论的网站/正规赚佣金的平台
  • 做团膳有哪些网站/今日头条十大热点