范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

二维数组如何当形参

  抛出问题
  最近碰到一个问题点,这里跟大家分享一下。有一个二维数组,我想把它传给一个函数。于是我把函数接口定义出来了,如下:  int array[2][3] = {1,2,3,4,5,6}; void fun(int **array) {   array[0][0] = 5; }
  当我试图直接把数组名传给函数时候, fun(array) 编译会报错,大概意思就是类型不匹配。既然类型不匹配,那我就直接强转成你所需要的类型,于是我又做了调整,fun((int **)array) ,这下确实不报错了。但是此时我还没意识到问题的严重性。不出意外的情况下意外还是发生了,只要进入到这个函数后,程序就挂了。那你知道是什么原因吗?如果不清楚就往下看吧... 指针
  先从指针说起,指针是一个特殊的变量, 它里面存储的数值被解释成为内存里的一个地址。要搞清一个指针需要搞清指针的四方面的内容: 指针的类型 、 指针所指向的类型  、 指针的值或者叫指针所指向的内存区 、 指针本身所占据的内存区 。 指针的类型
  只要把指针声明语句里的指针名字去掉,剩下的部分就是这个指针的类型。例如:  int*ptr;      //指针的类型是 int* char*ptr;     //指针的类型是 char* int**ptr;     //指针的类型是 int** int(*ptr)[3]; //指针的类型是 int(*)[3]指针所指向的类型
  只须把指针声明语句中的指针名字和名字左边的指针声明符*去掉, 剩下的就是指针所指向的类型。例如:  int*ptr;      //指针所指向的类型是 int char*ptr;     //指针所指向的的类型是 char int**ptr;     //指针所指向的的类型是 int* int(*ptr)[3]; //指针所指向的的类型是 int()[3]指针的值
  在32位程序里,所有类型的指针的值都是一个32位整数,因为32位程序里内存地址全都是32位长。  指针本身所占用的内存大小
  意思是指针本身占了多大的内存,在32位平台里,指针本身占据了4个字节的长度。可以使用sizeof(指针的类型)测试。  一维数组
  对于一个一维数组 int array[10] ,数组名代表一个常量地址 ,该地址指向第一个元素。以下两种情况数组名不能当指针使用。 &
  对数组名取址, int *p_array = &array ,&这个运算符也很有讲究的,暂时不多说了。 sizeof
  sizeof(array) 计算的是整个数组在内存中所占用的空间。 二维数组
  二维数组本质上是以数组作为数组元素的数组,即"数组的数组"。假设我们定义了一个二维数组 int array[2][3] = {1,2,3,4,5,6} 。
  网上有很多地方都再说数组名 array 和array[0] 、&array[0] 以及&array[0][0] 是等效的。那我们代码测试一下。 printf("%#x,%#x,%#x,%#xr ",array,array[0],&array[0],&array[0][0]);  Terminal: 0x404008,0x404008,0x404008,0x404008
  因为这几种写法输出地址都是相同的,所以有的同学自然就认为这几种写法就是一样的。虽然地址相同,但是实际意义是有区别的,我们继续看下面的代码。  //这里重新定义了指针变量,能够方便的知道右值得类型 int *p_array1 = array[0]; int *p_array2 = &array[0][0]; int (*p_array3)[3] = &array[0]; int (*p_array4)[3] = array;    printf("%#X,%#X,%#X,%#X,%#Xr ",array,++p_array1, ++p_array2, ++p_array3, ++p_array4);  Terminal: 0X404008,0X40400C,0X40400C,0X404014,0X404014
  根据以上实验分析能够看出: array[0] 与&array[0][0] 指针类型相同,都是int * ,地址存放的是int数据,当指针自增1时地址都偏移了一个int类型的大小。
  &array[0] 与array 指针类型相同,都是int (*)[3] ,首先它是一个数组指针,这个指针指向一个数组,数组中数据的类型为int型。当指针自增1时地址都偏移了一个数组的长度(即3个int数据的大小)。
  所以说 array 只和&array[0] 真正意义等效。那怎么去理解这几种表达呢 ?
  表示
  含义
  array
  是一个数组指针,类型为int (*)[3]。指向二维数组中第一个元素(元素是一维数组),指针所指向的内存大小为一维数组的长度
  array[0]
  是一个指针,类型为int *。就相当于一个一维数组名,指向一维数组中第一个元素的地址,指针所指向的内存大小为一个数据长度
  &array[0]
  是一个数组指针,类型为int (*)[3]。相当于对一维数组取地址。指针所指向的内存大小为一维数组的长度
  &array[0][0]
  是一个指针,类型为int *,是对二维数组中第一个数据取地址,注意是数据不是元素,指针所指向的内存大小为一个数据长度
  如以上能够理解清楚,那么文中的问题应该就能够自己分析清楚了。  二级指针
  先定义一个二级指针 int **p ,首先p是一个指针,在这个地址中存放的数据是指向一个整形数据的地址。 问题解答
  接着看文章中的问题,把一个二维数组强转成二级指针传给了函数。注意二维数组名的类型是一个 数组指针 和二级指针 完全不是一个东西。那么会出现什么问题呢? int array[2][3] = {1,2,3,4,5,6};  int main(int argc ,char **argv) {   int **p_data = (int **)array;   printf("%#x, %dr ", p_data, *p_data); }  Terminal: 0x404008, 1
  地址
  数据
  0x404008
  1
  0x40400C   2
  0x404010   3
  0x404014   4
  0x404018   5
  0x40401C   6
  看上面的例子,array的地址为0x404008,当把一个二维数组强转成二级指针的时候。p_data地址中存放的数据为1,因为二维数据中第一个数据就是1。根据二级指针的定义,这个数据1又会当成一个地址,该地址指向的内存才是最终的数据。   但是呢,这个地址1其实是个数据,并不是真正的地址。如果访问地址1中的数据,就属于非法访问地址了,可能会进入异常。 二维数据当函数入参   通过以上学习我们已经知道二维数组名就是一个 数组指针 ,我们函数就可以像下面这样声明。 void fun(int array[][3], int row); void fun(int (*p_array)[3], int row); void fun(int row, int column, int array[row][column]);实参与入参   最后在看下,应该如何定义与实参相对应地形参的数据类型。   含义   实参   形参   二维数组(数组的数组)   int array[4][6]   int (*array)[6]   指针数组(数组中的数据是指针)   int *array[6]   int **array   数组指针(指向数组的指针)   int (*array)[6]   int (*array)[6]   二级指针(指针的指针)   char **array   char **array

四十年的同学聚会,有人拒绝参加,你怎么看待这件事?我一朋友是老板,他们搞了一次40年同学聚会,在市里宾馆住的,每个同学都带上自己的爱人,往返机票车车票吃住玩费用全部报销,费用由几个企业家同学出资,玩了一星期,统一服装,结束时每对夫怎样能让人少产生尿酸?在讲如何少产生尿酸前,需要给大家说的是,我们要区别高尿酸血症和痛风。为什么要做这样的区别呢?因为在不少人认为,尿酸高就需要采用降尿酸药物治疗,这样才能让人少产生尿酸。如果仅仅是无症25岁,厌倦了销售,大专文凭。找工作很久了。该做什么?销售工作是一个很有挑战性的工作,找工作一定要从自身出发,,看自己适合做什么工作。有些人天生就适合做销售,而有些人则适合做技术方面的工作,因人而异。25岁,大专文化,找什么工作合适。副职领导和正职领导不和,在报销旅差费问题上故意不签字怎么办?多年前,我们县有一个局长,在和司机出差的时候,车子出了问题,在异地修理,花了6000多块钱。回来之后,单位司机拿发票报账,分管财务的副局长说车子才买了没多久,在领导审核一栏上,说自我想问下山东省的大学对本省考生有什么优惠政策吗?每年高考完,你会发现你的同学,基本上都在省内上大学。为什么都不愿意出省?因为省内大学学校相对好一些,分数相对低一些?为什么分数会相对低一些?这就是因为本省的大学对本省考生有很大优惠从唐山回石家庄,走高速过天津,二维码会变黄或带星号吗?为了保险起见,如果只是在天津地区路过,不下高速的话,上了高速以后把手机关机或者打开飞行模式,过了天津地区后再开机或关闭飞行模式。100会变的,这就是大数据作用,看似事不大,它体现了腌鱼腌肉隔几天翻一次?本期导读腌鱼腌肉隔几天翻一次?腌鱼腌肉,是制作腊鱼腊肉必不可少的前期工作。腊鱼腊肉是传统的腌制食物,也是春节前必备的年货之一。自古就有冬腊风腌,蓄以御冬的习俗。入冬后,气温降低,空螺蛳粉闻起来很臭,臭的原因是什么?从零八年开始吃到柳州的螺丝粉后,只要路过柳州,不管多忙都去吃一次不可!你所说的臭,我没吃出来过,除非用料有问题,用的是不新鲜的螺丝才有可能会臭!所以吃的时候注意了!表示第一次吃螺蛳小儿脾胃虚弱怎么调理?脾虚这是中医方面的说法,脾的作用是运化水谷精微,就像火车上的小餐车,推着我们大家需要的食物和水,运送我们所需要的营养物资,脾虚可以理解为是这个小车出问题了。有的人是装的东西太多了,山茶油虽然好,但是没有想象中的那么好卖,是什么原因?山茶油是天然的黄金式食用油料,对人身体起保健作用,适当用真蜂蜜3克加生山茶油3克一5克空服治便结便秘的效果是百分之九十以上,并能清除消化道,胃,直肠,大肠一切细菌,病毒,寄生虫卵,求推婴儿面霜!急?郁美净,我女儿小时候我俩一起用,20年了,我俩还在用。华西珐玛还不错,亲测有效,可以试试郁美净,强生都可以啊宫中策我家宝宝之前用国外的丝塔芙,后来疫情不敢买就用国货启初,夏天用启初
你见过把话说满的人的后果吗?我在农贸市场当管理员,有一天,一位女顾客和市场里卖鱼的男商户两人一路争吵着敲开了办公室的门。他俩进来后,我问双方发生什么事了,连问两遍,双方没有一个搭理我,还在继续争吵。我心想好家企业工人和灵活就业人员,为什么不能享有公务员提前退休的待遇?制定者又是实施者和执行者不敢回答这个问题。说的太清楚了容易404。自己多联想吧!如今国家所有工人和履行公职人员,自国家颁布社会保险法以来,都进入了参保对象,对参保者除按法定规定退休成都的房子还能投资吗?未来趋势如何?还可以投资!作为准一线城市,未来四川的人口会进一步向成都平原积聚,刚性需求摆在那里,它的价格只会上涨,不会下跌!成都的房产,长持我觉得是没有问题的。虽然说1617年这一轮涨幅非常大老实人生气是什么样子?老实人生气,是一件很可怕的事情。老实人平常在生活做什么事情都是默默无闻,有利益也不能积极争取。遭遇到不公正的事情时,总是忍气吞声,把事情放到心底。长此以来,慢慢肚子里堆积的事情越来世界水日,昆仑山矿泉水超高海拔工厂邀消费者云参观3月22日是第三十一届世界水日,我国第三十六个中国水周同时开启。今年中国水周活动主题为强化依法治水携手共护母亲河。当天,在中华母亲河的源头迎来了一场别开生面的直播坐落于青藏高原三江深圳多处禾雀花绽放山野禾雀报春群鸟栖枝近日,梅林绿道上的禾雀花盛开。深圳特区报记者李忠摄读特客户端深圳新闻网2023年3月24日讯(深圳特区报记者林清容)春天里的深圳处处花团锦簇,在满城花海中,一种外形独特的花十分吸睛成都往返塔什干直飞航线即将开通来源四川日报川观新闻川观新闻记者兰珍3月24日记者获悉,3月27日起,长龙航空正式开通成都天府往返塔什干国际直飞航线,后续还将陆续开通更多国际航线。此外,3月26日起,中国民航正式真容即将显现!化石医生在海博馆公开修复鱼龙化石来源津滨海客户端津滨海讯(记者简讯报道秦小明摄影)第一次看到现场修复化石,太震撼了!3月23日,正在滨海新区旅游的山东游客夏女士对于意外撞见的鱼龙化石修复场景表示惊喜,并拿手机记录北京德云社剧场最值得去的景点之一时至今日,国人已无人不知郭德纲,无人不知德云社,来北京,不听段郭式相声,未免遗憾。低音号语音导游德云社由相声演员郭德纲先生于1995年创建,其宗旨为让相声回归剧场,做真正的相声。2陈梦14负于马特,正常吗?正常主要原因如下一马特作为国乒男队的削球代表性人物经验丰富,打法独特且削中反攻,攻守兼备大梦虽是女乒世界大赛战绩最好的运动员,但由于力量速度和旋转的综合对抗中,和马特不可同日而语所打羽毛球上瘾是一种病?该怎么治?其实世界上有一种很可怕的病,那就是穷病,打羽毛球很费钱的,好的球拍基本都在千元以上,你还需要球衣球包球袜球鞋,消耗品羽毛球球线手胶,再加上场地费和饮料费,如果离得远还需要汽油费和停