| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 487 人关注过本帖
标题:新手求助,一个C程序看不懂
只看楼主 加入收藏
chanber
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2010-7-22
结帖率:0
收藏
已结贴  问题点数:20 回复次数:4 
新手求助,一个C程序看不懂
#include"stdio.h"
int *seek(int (*pnt_row)[3])
{int i=0,*pnt_col;
pnt_col=*(pnt_row+1);
for(;i<3;i++)
if(*(*pnt_row+i)<60)
{
    pnt_col=*pnt_row;
    break;
}
return(pnt_col);
}
main()
{
    int grade[3][3]={{55,65,75},{65,45,85},{75,80,90}};
    int i,j,*pointer;
    for(i=0;i<3;i++)
    {
        pointer=seek(grade+i);
        if(pointer==*(grade+i))
        {
            printf("NO.%d grade list:",i+1);
            for(j=0;j<3;j++) printf("%d ",*(pointer+j));
            printf("\n");
        }
    }
}
关于数组指针那一块看不懂啊 ,请高手帮忙解析一下下,多谢了
搜索更多相关主题的帖子: include return 
2010-07-22 11:31
do8do8do8
Rank: 10Rank: 10Rank: 10
来 自:沙滩
等 级:贵宾
威 望:17
帖 子:366
专家分:1845
注 册:2010-7-2
收藏
得分:10 
要懂指针 就要懂 这些 指针的类型 指针的指向类型 指针的指向内容
指针的类型 就去去掉指针的名字剩下的就是指针的类型
如:int *p;去掉p 那么 这个指针的类型就是 int *;
指针的指向类型 就是去掉指针的名字和最接近的*号
如 int *p;去掉*p 那么这个指针所指向的类型是int;
如 int **p;去掉*p 那么这个指针所指向的类型是 int *;
指针所指向的内容就是 。。。。。。。。(不说你也懂)
根据上面的术语帮你这么个说:
#include"stdio.h"
int *seek(int (*pnt_row)[3]) 这是个一维数组   
{int i=0,*pnt_col;         
pnt_col=*(pnt_row+1);  这里是其实是个设置的问题 因为它是根据地址的比较来输出的 如果地址相等就输出
                       这么说吧 1等于1,这个没什么好争议的吧,但是 1等于(?)把1隐藏起来先,
                       这好比:开始不信任随便给它个值  1等于狗
                       内部自检问题,外头说什么,爷们我不信啊,先检查检查核对核对先。
                       暗中进行检查,一检查正常,盖章批准 1等于1.如果检查到什么病啊 毒啊。
                       好了,那么就死啦死啦地,直接让 1等于狗 出现给外界,外界就不高兴了 不输出
                     
for(;i<3;i++)      
if(*(*pnt_row+i)<60)   *pnt_row是一维数组的首地址,*pnt_row+i就是一维数组的第i个值的地址,自然*(*pnt_row+i)就是

                        一维数组的第i个元素的值。
{
    pnt_col=*pnt_row;  这个就是把grade[3][3]的行地址赋给pnt_col 因为外面就是靠行地址进行判断的哦
                       
    break;
}
return(pnt_col);  返回一个指针
}
main()
{
    int grade[3][3]={{55,65,75},{65,45,85},{75,80,90}};
    int i,j,*pointer;
    for(i=0;i<3;i++)
    {
        pointer=seek(grade+i);     seek函数其实是传递每一行过去
                                    pointer得到seek函数返回的地址
        if(pointer==*(grade+i))
        {
            printf("NO.%d grade list:",i+1);
            for(j=0;j<3;j++) printf("%d ",*(pointer+j));
            printf("\n");
        }
    }
}


[ 本帖最后由 do8do8do8 于 2010-7-22 14:07 编辑 ]

学C语言从底层开始,学编程从问题开始,一日学会C!!!
2010-07-22 12:21
chanber
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2010-7-22
收藏
得分:0 
回复 2楼 do8do8do8
多谢多谢,我还是有个地方不太明白,就是这个程序里第4行pnt_col=*(pnt_row+1);和第8行pnt_col=*pnt_row;分别啥意思啊,还有第6行里那个*(*pnt_row+i)是怎么个意思,怎么就代表pnt_row的一行啦
2010-07-22 12:33
erikyo
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:2
帖 子:270
专家分:1154
注 册:2010-6-10
收藏
得分:10 
#include <stdio.h>

int *seek(int (*pnt_row)[3])     //seek函数是返回值是int类型的指针,参数是int类型的行指针
{
    int i=0;
    int *pnt_col = NULL;        //定义一个int类型的指针变量并初始化为NULL
    pnt_col = *(pnt_row+1);        //给定义好的指针变量赋值,该值是行指针指向的二维数组的第二行首元素的首地址
    for( i = 0 ; i<3 ; i++)
        if(*(*pnt_row+i) < 60)    //*pnt_row是二维数组第一行的首地址,+i是得到该行其他元素的首地址,*(*pnt_row+i)整体就是取二维数组的每个元素
        {
            pnt_col=*pnt_row;    //检查到小于60的元素之后,把该元素所在行的首元素的首地址给pnt_col
            break;                //跳出循环
        }
    return(pnt_col);            //返回循环体中找到的地址
}

int main()
{
    int grade[3][3]={{55,65,75},{65,45,85},{75,80,90}};
    int i,j,*pointer;
    for(i=0;i<3;i++)
    {
        pointer=seek(grade+i);            //返回找到的地址给pointer
        if(pointer==*(grade+i))            //判断返回的地址和每行的首元素的首地址是否相等
        {
            printf("NO.%d grade list:",i+1);
            for(j=0;j<3;j++)            //输入有小于60这个元素的行里面所有的元素
                printf("%d ",*(pointer+j));
            printf("\n");
        }
    }
}
2010-07-22 12:36
do8do8do8
Rank: 10Rank: 10Rank: 10
来 自:沙滩
等 级:贵宾
威 望:17
帖 子:366
专家分:1845
注 册:2010-7-2
收藏
得分:0 
我在上面已经更正了

学C语言从底层开始,学编程从问题开始,一日学会C!!!
2010-07-22 14:02
快速回复:新手求助,一个C程序看不懂
数据加载中...
 
   



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

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