| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 742 人关注过本帖
标题:函数间是怎样联系起来的
只看楼主 加入收藏
guozhencai
Rank: 1
等 级:新手上路
帖 子:50
专家分:0
注 册:2005-3-9
收藏
 问题点数:0 回复次数:7 
函数间是怎样联系起来的
main() {void sb(float*p,int n); void ab1(float(*p)[4],int n); float score[3][4]={{65,67,70,60},{80,87,90,81},{90,99,100,98}}; sb(*score,12); sb1(score,2); } void sb(float*p,int n) {float*p_end; float sum=0,aver; p_end=p+n-1; for(;p<=p_end;p++) sum=sum+(*p); aver=sum/n; printf("sb=%5.2f\n",aver); } sb1(float(*p)[4],int n) { int i; printf("the soreofNO.%d are:\n",n); for(i=0;i<4;i++) printf("%5.2f,",*(*(p+n)+i)); getch(); } 学习指针都很久了 但是很多问题都很模糊~~~无奈啊~~ 希望网上朋友能帮帮忙 请说说你们是怎样理解这道题的 特别是各个函数间是怎样联系起来的 希望能帮帮我谢谢!!!
搜索更多相关主题的帖子: float int sum score 
2005-06-18 17:43
weizheng
Rank: 1
等 级:新手上路
威 望:2
帖 子:286
专家分:0
注 册:2005-4-21
收藏
得分:0 
首先,你要搞清楚函数值的返回方式,两种,一种是值传递,另一种是地址传递。而这里你所提到的就是指针,我不再赘述指针的好处了,你可以参考置顶的帖子。指针就是一种地址传递方式,正是这个特性决定了他的用法,我想说到这里你应该知道这个函数是如何实现的了吧!

温和如玉,完美纯正。
2005-06-18 18:30
weizheng
Rank: 1
等 级:新手上路
威 望:2
帖 子:286
专家分:0
注 册:2005-4-21
收藏
得分:0 
首先,你要搞清楚函数的返回方式,这里你所指的指针,就是地址返回方式,通过形参的调用,说到这里你应该知道了吧!~~~~~~~

温和如玉,完美纯正。
2005-06-18 18:34
guozhencai
Rank: 1
等 级:新手上路
帖 子:50
专家分:0
注 册:2005-3-9
收藏
得分:0 
谢谢!! sb1(score,2) .............. sb1(float(*p)[4],int n) 还是不明白啊 能说说你是怎样理解的吗?
2005-06-18 18:55
小悟空
Rank: 1
等 级:新手上路
帖 子:218
专家分:0
注 册:2005-5-14
收藏
得分:0 
多看看书啊~~~!!!

2005-06-18 19:54
stnlcd
Rank: 1
等 级:新手上路
帖 子:177
专家分:1
注 册:2004-11-21
收藏
得分:0 
float (*p)[4] 表示p是一个指向数组的指针,它所指向的那个数组有4个元素,并且这些元素的类型为float型。 float *p[4] 表示p是一个数组,该数组内包含了4个指针,每个指针都指向类型为float的元素。 沿着这个思路sb1函数可以改为: sb1(float *p,int n) { int i; printf("the soreofNO.%d are:\n",n); for(i=0;i<4;i++) printf("%5.2f,",*(p+4*n+i)); getch(); } 这样更好理解一些。 还有:无论是你的sb1函数还是我的sb1函数,调用形式为sb1(score,2)或为sb1(*score,2)都不影响结果。

要让一个男人破产,请给他一架相机,要让一个男人倾家荡产,请给他一架望远镜。
2005-06-18 20:42
guozhencai
Rank: 1
等 级:新手上路
帖 子:50
专家分:0
注 册:2005-3-9
收藏
得分:0 
谢谢! 我还想问: 在用指针变量做形参以接受实参数组名传递来的地址时 有2种方法(1)用指向变量的指针变量(2)用指向一维数组的指针变量(书上是这样写的) 那么这两种指向的方法有什么差异?什么情况下用第一种方法?什么情况下用第二种方法? sb1(float(*p)[4],int n)这里显然用了第二种的指向方法,为什么?
2005-06-19 07:54
stnlcd
Rank: 1
等 级:新手上路
帖 子:177
专家分:1
注 册:2004-11-21
收藏
得分:0 
指针是一个很灵活的东西,一般没什么定式。
在编一般程序(不是系统程序)的时候我觉得根本不需要你说的那些理论。一般情况下用到一维指针就可以了,基本上不用二维以上的指针:比如用一个指针指向一片连续的内存空间,或用一个指针指向远堆的显存等等,或者在函数调用的时候改变实参等,一般都要一维的指针就够了。当然数组有一点特殊,特别当数组的维数比较高的时候。高维数组在作为参数进行函数调用的时候你可以这样处理:
比如数组是3维的:
typedef int Matrix[MAX_M][MAX_N][MAX_P];  /*Matrix 用typedef语句定义成了3维数组*/
在函数定义上如果是传值:
void func(Matrix Array,int m,int n,int p) {......}
如果是传地址:
void func(Matrix *Array,int m,int n,int p){....}
这样也只用一维指针指向高维数组了,也没有必要定义类似int ***p等去指向高维数组,合理利用struct,union,typedef
等语句可以减少指针的使用量。
所以,一般在编程的时候并不需要二维以上的指针,一维足够了!
学习二维指针只是为了帮助理解指针的应用,减少编程中犯错误的机会,没必专的太深。
可以多看看数据结构,对学习c语言帮助极大,当然还要多多的编程序才可以。

要让一个男人破产,请给他一架相机,要让一个男人倾家荡产,请给他一架望远镜。
2005-06-19 22:57
快速回复:函数间是怎样联系起来的
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.023018 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved