各位程序员!我有个C语的问题不了解。请大家指教一下?

linlky 2003-10-16 10:10:53
我的源程序是这样的:
main()
{
float score[][4]={{60,70,80,90},{50,89,67,88},{34,78,90,66}};
float *search(float (*p)[4]);
float *p;
int i,j;
for(i=0;i<3;i++)
{
p=search(score+i);
if (p==*(score+i)){我个人认为这p是一个地址.*(score+i)是个元素                值它们怎么可能可以比较?
                如果它们俩个都是地址?地址也可能比较吗? 
{printf("No.%d scores:",i);
for(j=0;j<4;j++)
printf("%5.2f",*(p+j))
printf("\n");}
}
}

float *search(float (*pointer)[4])

int i;
float *pt;  这是一个指针变量
pt=*(pointer+1); *(pointer+1)是个元素值。而pt只能放地址的
                它们可能这样做吗?请指教?  
for (i=0;i<4;i++)
if(*(*pointer+i)<60) pt=*pointer; 我想应该*pt=*pointer可是
                          这是不行做的呀。
return(pt);
}
   
  这个程序是对成绩。找出其中不及格。。。。



...全文
34 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
DESL 2003-10-21
  • 打赏
  • 举报
回复
main()
{
float score[][4]={{60,70,80,90},{50,89,67,88},{34,78,90,66}};
float *search(float (*p)[4]);
float *p;
int i,j;
for(i=0;i<3;i++)
{
p=search(score+i); //调用指针函数
/*第一次循环这里是将数组score[0][0]的地址赋给p*/
if (p==*(score+i))
/*这里是判断p是否等于score[0][0] score[0][0]=*(a[0]) */
{printf("No.%d scores:",i);
for(j=0;j<4;j++)
printf("%5.2f",*(p+j))
printf("\n");}
}
}

float *search(float (*pointer)[4])

int i;
float *pt;  
pt=*(pointer+i); 
/*这里是将score[0][i]的地址传给pt*/ 
for (i=0;i<4;i++)
if(*(*pointer+i)<60) pt=*pointer;
    /*这里是将调过来的数组score[0][0] score[0][1].. score[0][4]和60进行比较*/
/* pt=*pointer; 是将score[0][0],score[1][0],score[2][0]..的地址传给pt*/  
return(pt);
}
//这个程序考的是函数指针   
geeksky 2003-10-20
  • 打赏
  • 举报
回复
参照下老谭那本C程序设计吧,有个例子跟你这个差不多的
Wolf0403 2003-10-20
  • 打赏
  • 举报
回复
呵呵,要是我当老板,写这样程序的家伙,见一个开一个
moonfkypm 2003-10-20
  • 打赏
  • 举报
回复
float *search(float (*p)[4]);
这个函数定义应该放在 main 之外。
我也是这么想的
可是考研的试卷就这么写的
而且谭浩强的书上也这么写的
uglykoala 2003-10-19
  • 打赏
  • 举报
回复
呵呵。:)
是是谭浩强谭浩强呵呵
IceKylin 2003-10-18
  • 打赏
  • 举报
回复
我想楼主其实是对二维数组和指针还不是很了解.其实程序是很清楚的.我现在仔细帮你分析一下.
首先如上面几位所说,*(score+i)也是地址,其中score代表二维数组第1行的首地址,于是score+i就表示第i+1行的首地址,而这个地址中存放的是这行所对应的元素的首地址,所以*(score+i)其实是第i+1行第一个元素的地址,根据数组下标的指针表达法,很容易理解*(*(score+i)+j)正是表示第i+1行,第j+1列的元素值.好了,接下来让我们来看程序:
我们先看search函数,point是主程序里的score+i,所以pt=*(pointer+1)这句是把数组的第i+2行的第一个元素地址传给pt,然后判断第i+1行里的四个数是否有小于60的,只要有一个,那么pt就指向这第i+1行.这样如果有不几格的返回的是第i+1行首元素的地址,否则是第i+2行的.这个值被传递给main函数里的指针p,再由if (p==*(score+i))这句判断p是否是第i+1行首元素地址,如果是则说明这行四个数字中至少有一个不及格的.于是将这行数字打出.
程序整体上就是这样,希望这样的回答可以令楼主满意.楼主只要多看点程序,自己再学着写点简单的,就可以掌握啦!
还有就是楼上的,人家明明叫谭浩强,不是唐浩强哦:)
uglykoala 2003-10-18
  • 打赏
  • 举报
回复
你是看的唐浩强的C 第二版把??
1)
*(score+i) 不是元素值。也是地址。
这是一个二维数组。
*(score+i)是指向第i行的第一个元素的地址。
*(*(score+i)+j)表示第i行第j个元素。
这个地方。你应该多看看书。书上写的很清楚了。把书上的几个例子看懂就可以了。
还有。就是你可以把*(score+i)可以看成是score[i] (当然是在二维数组中)
score[i]表示的就是第i行的地址,
同时也是第i行的第一个元素的地址

2)
地址可以不可以比较大小我不是很清楚。但是。
地址一定是可以判断是不是相等的。所以。他们可以比较是不是相等。

3)*pt=*pointer当然是不可以的。*pt是一个元素值但是*pointer是一个地址。那怎么可以赋值呢??
如果第一个问题搞懂了。第三个问题也就清楚了。
TianGuangZao 2003-10-17
  • 打赏
  • 举报
回复
*(score+i) 还可以写成 score[i], 它们是等效的。
score[i] 是指向第 i 行行首的指针。
如果这个理解了,那么 *(*(p+i)+n) 也是很容易理解的。
*(*(score+i)+n) 相当于 *( score[i] + n);
我们分开来看:
score[i] + n 表示找第二行,偏移量为 n (这里是 float类型) 的元素位置。
*(score[i]+n) 通过解引用该地址(指针)把该元素值取出来。

Bandry 2003-10-17
  • 打赏
  • 举报
回复
二维数组
*(score+i)的值是float *类型啊
efelix 2003-10-16
  • 打赏
  • 举报
回复
注意float*和float**的区别
Wolf0403 2003-10-16
  • 打赏
  • 举报
回复
呵呵,好像看错了,失败。
说一下:
float *search(float (*p)[4]);
这个函数定义应该放在 main 之外。
Wolf0403 2003-10-16
  • 打赏
  • 举报
回复
应该是 p == (array + i),比较两个指针指向的地址
efelix 2003-10-16
  • 打赏
  • 举报
回复
1、不错*(score+i)是个元素值,不过这个元素也是一个地址,指向数组score[i]的首元素score[i][0]。
2、同上
3、当然不行,*pt是float型,*pointer是float型指针
hubs 2003-10-16
  • 打赏
  • 举报
回复
第一种情况我不太懂,但第二,三其实是同一种情况.
对于二维指针(*p)[m],*p表示的其实是地址,它可以写成*(p+0),如果你要访问行地址的话,可以写成*(p+i),如果你要访问行的第n个元素的话,可以写成*(*(p+i)+n),这和一维数组有些不同,其实谭浩强那本书就解释的还算比较详细.
nirvana_li 2003-10-16
  • 打赏
  • 举报
回复
同意efelix(felix) 的,楼主主要还是对指针的理解还有些模糊。多看看实际的例子再写程序,效果要好的多.....

24,854

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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