登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

图像处理 视频分析 机器视觉 模式识别

方向比努力更重要

 
 
 

日志

 
 
关于我

河北软件开发项目,电子警察卡口项目,公安天网项目,媒体流处理,数字图像处理。媒体服务器 RTSP、图像处理、车牌识别……DCT变换,H.264压缩

数组做形参  

2010-05-11 13:49:49|  分类: C + 算法 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

#include <iostream.h>
void OpenNew(int close_id[],int x);
void OpenFour(int close_id[],int x);
void Close(int close_id[],int x);
void OpenFour(int close_id[],int x)
{
}
void OpenNew(int close_id[],int x)
{
 int index(0);
 while(-1!=close_id[index])
 {
  index++;
  if(index>=4)
  {
   return;
  }
 }
 close_id[index]=x;
  
}
void Close(int close_id[],int x)
{
}
void main()
{
 int a[4];
 for(int i=0;i<=3;i++)
 {
  a[i]=-1;
 }
 cout<<a[0]<<a[1]<<a[2]<<a[3]<<endl;
 OpenNew(a,3);
 cout<<a[0]<<a[1]<<a[2]<<a[3]<<endl;
 OpenNew(a,2);
 cout<<a[0]<<a[1]<<a[2]<<a[3]<<endl;
 OpenNew(a,1);
 cout<<a[0]<<a[1]<<a[2]<<a[3]<<endl;
 OpenNew(a,0);
 cout<<a[0]<<a[1]<<a[2]<<a[3]<<endl;
}

___________________________________________________________________

函数中的形参可以是数组,如int   root(int   a[]),函数声明中,a[]是形参,实际上真正的形参应是a,a是个常量,怎么能接受值呢?有解释说当a[]在函数中作为形参出现时,其属性就改变了,其中的a不再是常量,变成了指针变量,所以可以接受地址值。这个解释倒也说得过去,本人就想,既然a[]中得a是作为指针变量充当形参,那么干吗不直接用指针变量当形参呢?那样看起来更顺眼,也更容易理解。于是声明一函数如下:int   root(int   *p),其中的p接受一数组首地址,然后用p对数组进行操纵,没想到也行。现在我的问题是:这两种对形参定义的方式各自存在的意义是什么?它们之间有什么不同?
 
 
 
对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 回复次数:30 
 
freshui
 
(五月的风)

等 级:
 #1楼 得分:0回复于:2007-04-16 15:39:39int   root(int   a[])

int   root(int   *)等价

还是你说的,   这样声明目的是为了顺眼
 
 
对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 精华推荐:谈谈C++的缺陷:一辆公共汽车是一辆汽车,一堆公共汽车却不是一堆汽车
 
wit2188
 


等 级:

 #2楼 得分:0回复于:2007-04-17 11:23:44其实教材里对指针变量做形参从而实现对数组的操作已经给出了说明,但它没有说明用数组做形参和用指针变量做形参两者的区别是什么。这两者的功能不会完全相同吧,总该有区别,哪怕是细微的。
 
 
对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 精华推荐:【勿跨省追捕和绿霸】既然上个帖子有人谈跨平台,小的我一时兴起,也开个帖子广邀英雄。 突出想法者50分一个档次,当然,分只是个情分。还望大家多多发表。。
 
wltg2001
 
(红猪)

等 级:

 #3楼 得分:0回复于:2007-04-17 11:30:02这两个其实是一个回事,int   root(int   a[])中,形参是a的地址,和用指针是一样的。
 
 
对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 精华推荐:关于软件工艺,C语言[不抛砖,盼引玉]
 
chenyi3315
 
(做程序员是一种美德)

等 级:

 #4楼 得分:0回复于:2007-04-17 11:30:29int   root(int   a[]),         //传数组名
int   root(int   *p),           //传指向数组的指针
 
 
对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 精华推荐:《!———— C++ 0x 即将夭折的新关键字 constexpr 为 VS 2010 拒绝 ————》
 
gshuangVC
 


等 级:

 #5楼 得分:0回复于:2007-04-17 11:38:28等价的

使用a[]可以增加可读性
 
 
对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 精华推荐:武汉富士康和东软,选择那个?
 
philipwang
 
(虫子)

等 级:

 #6楼 得分:0回复于:2007-04-17 13:22:01如果是二维数组如何传入呀!
这时就要用到行指什了!
int   root(int   (*p)[x]),
这里的x为二维数组的每行的元素个数。
 
 
对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 
 
ayw215
 
(松花鼠)

等 级:

 #7楼 得分:0回复于:2007-04-17 13:58:28二维数组也可以直接传指向数组滴指针
 
 
对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 
 
yzx1983
 
(捕风捉影)

等 级:

 #8楼 得分:0回复于:2007-04-17 15:57:44等价,都是指针。
这种情况只在作为函数参数时存在,否则数组名与指针是不等价的。
 
 
对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 
 
loongee
 
(♂龍の翼♀)

等 级:

 #9楼 得分:0回复于:2007-04-17 17:51:28注意注意!

人家LZ问了个问题是“这两种对形参定义的方式各自存在的意义是什么?”别光回答两种方法一样不一样好不好?

请各位达人们认真回答这个问题,别回避。
 
 
对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 
 
wit2188
 


等 级:

 #10楼 得分:0回复于:2007-04-18 14:06:18呵呵,诚如loongee所说,诸位其实都没有回答问题。
首先我能肯定这两种方式在功能上一定是不同的,为什么?因为我肯定发明c语言的老外绝不会吃饱了撑着弄两个功能完全相同的程序设计规则,他有这么蠢吗?所以这两种方式一定各有各的特殊功能,也就是它们之间一定有不同之处。
如果的确没人能合理解释,呵呵,别说我过分,我真有点怀疑当初翻译原作的那个人是否真的完全领会了作者的设计思想。
 
 
对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 
 
freshui
 
(五月的风)

等 级:
 #11楼 得分:0回复于:2007-04-18 14:07:07不是说了吗
为了顺眼才那样写的
 
 
对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 
 
mLee79
 


等 级:
 #12楼 得分:0回复于:2007-04-18 14:09:56ls都是正解,鉴定完毕   ..
 
 
对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 
 
yzx1983
 
(捕风捉影)

等 级:

 #13楼 得分:0回复于:2007-04-18 14:19:10首先我能肯定这两种方式在功能上一定是不同的,为什么?因为我肯定发明c语言的老外绝不会吃饱了撑着弄两个功能完全相同的程序设计规则,他有这么蠢吗?所以这两种方式一定各有各的特殊功能,也就是它们之间一定有不同之处。

---------------------
此理由非常不充分。
举个例子,你认为
char   a,b;

char   a;
char   b;
有何不同?老外为何吃饱了撑的要支持这样两个功能完全一样的程序设计规则?
 
 
对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 
 
studyall123
 
(just do it)

等 级:

 #14楼 得分:0回复于:2007-04-18 16:12:42en,看看c专家编程,第九章。
 
 
对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 
 
wit2188
 


等 级:

 #15楼 得分:0回复于:2007-04-19 14:48:29yzx1983,我的确不知道这二者的区别,在我的印象中,c语言好像有好些功能相同的设计规则,难道这些规则真的完全相同吗,只是表现形式不同?我不敢苟同,保留自己的意见。
 
 
对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 
 
wit2188
 


等 级:

 #16楼 得分:0回复于:2007-04-19 21:13:39呵呵,没人有异议吗?
 
 
对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 
 
lovemaomao_1987
 


等 级:

 #17楼 得分:0回复于:2007-04-19 21:59:30int   a[]中的a和int   *p中的属性是一样的p   是一个指针代表的是地址
 
 
对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 
 
wit2188
 


等 级:

 #18楼 得分:0回复于:2007-04-20 16:21:58这里的a和p在做形参时属性是一样的,但它们可不是地址,地址是常量,而它们是变量,指针变量,可以接受地址值。
 
 
对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 
 
kouzhongling
 
(在地球上的火星人^-^)

等 级:

 #19楼 得分:0回复于:2007-04-20 18:08:53语言是为表达语意
对于形参   *a   a[]
都是表达:调用者传入的是一个连续的字节(对象)的首地址而已
至于要是把它理解成纯数组,那是人的理解,不是编译器的理解
 
 
对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 
 
wit2188
 


等 级:

 #20楼 得分:0回复于:2007-04-21 00:10:53还有个问题,通过实验,我发现实参如果是二维数组,那么形参就不能定义成一个同类型的指针变量,否则编译系统会提示出错,而必须定义成一个同类型的二维数组,只有这样才能接受实参以实现对实参对应空间的操作,这是为何?
 
 
对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 
 
mayihamigua
 


等 级:

 #21楼 得分:0回复于:2007-04-21 00:51:41等价的吧...
好看而已...
 
 
对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 
 
mymtom
 
(mymtom)

等 级:
2
 #22楼 得分:10回复于:2007-04-21 07:07:47/*
在做形参时   *a   与   a[]   是等价的,实际上C编译器只是把a[]当成指针,
你甚至可以把a[]写成a[1]或者a[100],实际上C编译器把a[1]和a[100]都当成指针。
至于二维数组做实参时,形参的可用的形式就更多了!试试下面的程序就明白了!
*/

#include   <stdio.h>

#define   ROW     (2)
#define   COL     (3)

static   void   foo(int   *p)
{
int   i;

for   (i   =   0;   i   <   (ROW   *   COL);     i++)
printf( "*(p   +   %d)   =   %d\n ",   i,   *(p   +   i));

}

static   void   bar(int   (*p)[COL])
{
int   i,   j;

for   (i   =   0;   i   <   ROW;     i++)
for   (j   =   0;   j   <   COL;   j++)
printf( "p[%d][%d]   =   %d\n ",   i,   j,   p[i][j]);

for   (i   =   0;   i   <   ROW;     i++)
for   (j   =   0;   j   <   COL;   j++)
printf( "(*(p+%d))[%d]   =   %d\n ",   i,   j,   (*(p+i))[j]);

}

int   main(void)
{

int   a[ROW][COL]   =   {   {0,   1,   2},   {3,   4,   5}   };

int   i,   j;
for   (i   =   0;   i   <   ROW;     i++)
for   (j   =   0;   j   <   COL;   j++)
printf( "a[%d][%d]   =   %d\n ",   i,   j,   a[i][j]);

foo(&a[0][0]);

bar(a);

return   0;
}

 
 
 
对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 
 
elephont9527
 
(此人未死,无事莫烧纸)

等 级:

 #23楼 得分:0回复于:2007-04-21 08:44:58等价的

使用a[]可以增加可读性

================================

正解
 
 
对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 
 
kouzhongling
 
(在地球上的火星人^-^)

等 级:

 #24楼 得分:0回复于:2007-04-21 11:26:54还有个问题,通过实验,我发现实参如果是二维数组,那么形参就不能定义成一个同类型的指针变量,否则编译系统会提示出错,而必须定义成一个同类型的二维数组,只有这样才能接受实参以实现对实参对应空间的操作,这是为何?
=======================================
依然从指针的语意本身来说:
既然lz那么喜欢思考
那你想过各种形式指针的内涵吗?
指针为何要区分类型?
我说一下我的理解
就说   p+1   来说
如果   p是   int*           那么那个1就代表4   byte(通常)
如果   p是   char*         那么那个1就代表1   byte
如果   p是   char(*)[10]     那么1就代表10   byte
如果   p是   int(*)[10]       那么1就代表40   byte
如果   p是   char(*)[10][10]那么....   100   byte

也就是说指针的类型实际上是为其运算服务的

二维数组对应的指针是行指针(*)[]     (作为参数它无条件等价于**)

对于数组和指针   我在blog简单的写了些东西   lz可以看一下
 
 
对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 
 
philipwang
 
(虫子)

等 级:

 #25楼 得分:0回复于:2007-04-24 16:25:34int   root(int   a[]),         //传数组名
int   root(int   *p),           //传指向数组的指针
这俩个效果是一样的,前一个是为了好看。因为数组名是不可改变的所以a传进去就像C++里的引用一样,又为了与int   a区分在后面用一个[]来说名它是一个int型数组的名。
 
 
对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 
 
philipwang
 
(虫子)

等 级:

 #26楼 得分:0回复于:2007-04-24 17:10:01当用int   root(int   a[]),         //传数组名
传入函数时,函数内不能对a进行a++或a--操作,a的地址是不能改变的。
 
 
对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 
 
mLee79
 


等 级:
 #27楼 得分:0回复于:2007-04-24 17:14:36谁说   a   的地址不能改变,   int   root(int   a[])   完全等于   int   root(int*a),   标准就酱紫定的   ...
 
 
对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 
 
mymtom
 
(mymtom)

等 级:
2
 #28楼 得分:0回复于:2007-04-24 17:31:13楼上说的有问题吧!
传入函数时,函数内不能对a进行a++或a--操作,a的地址是不能改变的,//   这是不对的

在做形参时   *a   与   a[]   是等价的,实际上C编译器只是把a[]当成指针,
你甚至可以把a[]写成a[1]或者a[100],实际上C编译器把a[1]和a[100]都当成指针。


不信你试试下面的函数是否能用!

#include   <stdio.h>

void   foo(int   a[100])
{
*(a++)   =   0;
*(a++)   =   1;
}

int   main(void)
{
int   a[2];

foo(a);

(void)   printf( "a   =   %d   %d\n ",   a[0],   a[1]);

return   0;
}
 
 

 


等 级:

 #30楼 得分:0回复于:2007-05-05 13:59:28一维数组和同类型指针变量做形参完全相同,楼上诸位众口一词,究竟是不是这样,我仍存疑虑。我的疑虑不是说诸位错了,诸位的说法肯定在应用中实践过了,所以不可能有错。我的疑虑是当初翻译者在翻译原作时是否真的做到了精确无误,如果真的精确无误,那么我就对原作者的设计思想产生兴趣了,当初作者为什么要把c语言设计成这个样子,这样的设计,其优缺点各是什么?
二维数组做实参,形参应该如何,楼上诸位的解释说实话,我不太懂,很可能是因为没掌握一些细节所致,暂且不表,留待以后解决。
 

  评论这张
 
阅读(3985)| 评论(0)

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018