C语言,当数组作为参数传递的时候,怎么获得数组的长度

melancholyB 2012-02-02 09:28:40
刚学C语言,遇到一个问题。
void main(){
int score[] = {10,20,30,40,50,60,70,80,90};
}
int getLength(int score[]){
*****
}
在方法。getLength里面。socre参数其实是一个指针,这样就没法求出数组的长度,想了好久,也试验了很多次,都没有找到求数组长度的方法,希望高手指点一下。
...全文
2633 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
PunWinger 2012-02-02
  • 打赏
  • 举报
回复
我才估计楼主没看清楚题目
大概会有这样的代码

#define NUM 20

...

int score[NUM];

...

double getAver(int score[])
{
//利用NUM求平均数
}

这样就等于已知数组长度了
还有废话一句,但是依靠传送数组参数是不可能获知数组长度的,不然也不会有很多库函数是需要传递数据结构大小的参数
XINGHUO456 2012-02-02
  • 打赏
  • 举报
回复
其实内核里面都是如此的,将数组和长度同时传入,尤其在处理网络报文的时候

static inline int
scan_ordinary(struct asyncppp *ap, const unsigned char *buf, int count)
{
int i, c;

for (i = 0; i < count; ++i) {
c = buf[i];
if (c == PPP_ESCAPE || c == PPP_FLAG
|| (c < 0x20 && (ap->raccm & (1 << c)) != 0))
break;
}
return i;
}
bobking1988 2012-02-02
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 yzg001212 的回复:]
16楼正解,可以改成下面这样:

C/C++ code


#include<stdio.h>
int getAvgScore(int score[])
{
int *p;
int num=0;
int sum=0;
p=score;
while((*p)!=-1)
{
sum+=*p;
num++;
p++;
}
return sum/num;
}

i……
[/Quote]
如果是允许自己改变数组内容的话还行,如果别人不让你在他数组后面加东西呢?人家就传正常数组你?
所以我基本确定此题坑爹啊!
bobking1988 2012-02-02
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 kolailoveyou 的回复:]
对于这个问题,若参数中不传送数组长度的话,只能借助指针实现数组结束判断,具体代码如下,希望对你有所帮助.
#include<stdio.h>
#include<unistd.h>
float avg(int score[])
{
int sum=0;
int num=0;
float avg=0.0;
int *p;
p=score;
while((*p……
[/Quote]
能行的通吗?*p是 int类型,不可能比较,即使p!=NULL也不行,因为score是分布在一段地址上,score最后一个元素再移动一个地址单位也是一个地址,虽然不是属于score的,但是也不会是NULL,NULL是一个不存在的地址。

另外楼主你别把你理解的题意发出来,你把原题一字不漏在描述一遍来看看,要一字不漏哦亲
凡迪 2012-02-02
  • 打赏
  • 举报
回复
16楼正解,可以改成下面这样:

#include<stdio.h>
int getAvgScore(int score[])
{
int *p;
int num=0;
int sum=0;
p=score;
while((*p)!=-1)
{
sum+=*p;
num++;
p++;
}
return sum/num;
}

int main()
{
int score[]={10,20,30,40,50,60,70,80,-1};//此处-1作为数组结束标志
int a=0;
a=getAvgScore(score);
printf("a=[%d]\n",a);
}
XINGHUO456 2012-02-02
  • 打赏
  • 举报
回复
先算出数组长度,将长度和数组同时传递给函数
kolailoveyou 2012-02-02
  • 打赏
  • 举报
回复
对于这个问题,若参数中不传送数组长度的话,只能借助指针实现数组结束判断,具体代码如下,希望对你有所帮助.
#include<stdio.h>
#include<unistd.h>
float avg(int score[])
{
int sum=0;
int num=0;
float avg=0.0;
int *p;
p=score;
while((*p)!=NULL)
{
sum+=*p;
num++;
p++;
}
avg=sum/num;
return avg;

}
int main()
{
int score[]={10,20,30,40,50,60,70,80,90};
printf("平均成绩为:%f\n",avg(score));
return 0;
}

ProgrammingRing 2012-02-02
  • 打赏
  • 举报
回复
数组要判断得尾部加个flag
IVERS0N 2012-02-02
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 ivers0n 的回复:]

在数组还没变指针前 length=sizeof(score)/sizeof(int) 一起作为参数传入函数

[/Quote]

下面无效 改正下
super_admi 2012-02-02
  • 打赏
  • 举报
回复
一般情况下,不能去求数组的长度吧?
首先,编译器对数组溢出是不做检查的。你定义了a[10],其实你使用a[20]也可以的,只不过会不会出错,就看你人品了。

字符串数组,是有结尾标志位的:'\0'

如楼上所说,你可以标注一个-1来作为结束标志。

不过更好的办法,还是传入一个长度值。很多函数都是这样的。比如最明显的main(int, char* [])
如果数组的长度可以计算出来,那main的第一个参数就没有必要了。
Occam's_Razor 2012-02-02
  • 打赏
  • 举报
回复
数组最后一个元素用一个不可能的成绩标注,比如 -1,表示数组结束
IVERS0N 2012-02-02
  • 打赏
  • 举报
回复
在数组还没变指针前 length=sizeof(score)/sizeof(int) 一起作为参数传入函数

不然定义一个宏 #define Getlength(arr) (sizeof(arr))/(sizeof(int))
melancholyB 2012-02-02
  • 打赏
  • 举报
回复
其实也不用求长度。只要知道怎么结束循环就行了。但是我不知道怎么结束循环。。。
sagegz 2012-02-02
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 melancholyb 的回复:]
没有。。。就是传入一个成绩数组。然后求出平均 成绩的题目。但是方法只能传一个成绩数组,其他都不能传递。
[/Quote]
这书坑爹呀,不调用函数效率还高点。
告诉楼主一个不幸的消息,作者突然发神经了,忽忽~
newpuple 2012-02-02
  • 打赏
  • 举报
回复
这个问题一般情况都是将数组长度连同数组地址一起作为入参传进去的,为什么非要算出来呢,多浪费时间
melancholyB 2012-02-02
  • 打赏
  • 举报
回复
没有。。。就是传入一个成绩数组。然后求出平均 成绩的题目。但是方法只能传一个成绩数组,其他都不能传递。
sagegz 2012-02-02
  • 打赏
  • 举报
回复
什么书?题目有答案?
melancholyB 2012-02-02
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 yzg001212 的回复:]
改成while((*p)!=null)
[/Quote]
这样也是不行的。
melancholyB 2012-02-02
  • 打赏
  • 举报
回复
如果不知道长度。怎么结束循环呢?
凡迪 2012-02-02
  • 打赏
  • 举报
回复
改成while((*p)!=null)
加载更多回复(6)

70,008

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧