| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3957 人关注过本帖
标题:[疑问]二维数组a[][], a和*a的区别
只看楼主 加入收藏
Emotiona
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:311
专家分:581
注 册:2017-3-7
结帖率:97.5%
收藏
已结贴  问题点数:18 回复次数:4 
[疑问]二维数组a[][], a和*a的区别
void file2 (char (*pcourse)[10], int *pnum, float *pscore, float *paver);
void good (char course[5][10], int num[10], float score[4][5], float aver[4]);
file2(course, num, *score, aver);        这里是用*score传的[0][0]首地址
good(course, num, score, aver);          这里用的0行首地址

为啥good函数用*score传地址会被警告,两者值都一样。
*a==*(a+0)==&a[0][0]     &a[0]==a;        用编译器调试,他们是不是是这样等价的?请详解下。谢谢!!!



#include<stdio.h>

int main()
{
    void input (int *pnum, float *pscore, float *paver, char (*pcourse)[10]);
    void avsco (float *pscore, float *paver);
    void avcou (char (*pcourse)[10],float *pscore);
    void file2 (char (*pcourse)[10], int *pnum, float *pscore, float *paver);
    void good (char course[5][10], int num[10], float score[4][5], float aver[4]);
    int num[4];
    float score[4][5], aver[4];
    char course[5][10];
    input(num, score[0], aver, course);
    avsco(*score, aver);
    avcou(course, *score);
    file2(course, num, *score, aver);
    good(course, num, score, aver);
}

void input (int *pnum, float *pscore, float *paver, char (*pcourse)[10] )
{
    int i, j;
    printf("please five courses!\n");
    for (i = 0; i < 5; i++)
    scanf("%s", (pcourse + i));
    printf("plese input NO. and score!\n");
    for (i = 0; i < 4; i++)
    {
        scanf("%d", pnum + i);
    for (j = 0; j < 5; j++)
        scanf("%f", (pscore + i * 5 +j));
    }

}

void avsco (float *pscore, float *paver)
{
    int i, j;
    float average, sum;
    for (i = 0; i < 4; i++)
    {
        sum = 0.0;
    for (j = 0; j < 5; j++)
    {
        sum += *(pscore + i * 5 +j);
    }
        average = sum / 5;
        *(paver + i) = average;
    }
}

void avcou (char (*pcourse)[10],float *pscore)
{
    int i;
    float sum=0.0, average;
    for (i = 0; i < 4; i++)
    {
        sum += *(pscore + i * 5);
    }
    average = sum / 4;
    printf("couese1:%s  average:%7.4f\n", *pcourse, average);
}

void file2 (char (*pcourse)[10], int *pnum, float *pscore, float *paver)
{
    int lable, i, j, k;
    printf("    =======Student who is file in two courses======\n");
    printf("NO.");
    for (i = 0; i < 5; i++)
    {
        printf("%s  ", *(pcourse + i));
    }
    printf("\n");
    for (i =0 ; i < 4; i++)
    {
        lable = 0;
        for( j = 0; j < 5; j++)
            if (*(pscore + i * 5 + j) < 60.0)
            ++lable;
            if(lable >= 2)
            {
              printf("%d    ", *(pnum + i));
              for (k = 0; k < 5; k++)
              printf("%7.4f ", *(pscore + i * 5 +k));
              printf("%7.4f\n", *(paver + i));
            }

    }
}

void good (char course[5][10], int num[10], float score[4][5], float aver[4])
{
    int i, j , k, lable;
    printf("        =======Student whose score is good=======\n");
    printf("NO. ");
    for (i = 0; i < 5; i ++)
    printf("%s  ", course[i]);
    printf("\n");
    for (i = 0; i < 4; i++)
    {
        lable = 0;
        for(j = 0; j < 5; j++)
        {
            if(score[i][j]>85)
            ++lable;
        }
        if(lable==5||aver[i]>=90)
        {
        printf("%d  ", num[i]);
        for( k = 0; k < 5; k++)
            printf("%7.4f  ", score[i][k]);
            printf("%7.4f\n", aver[i]);
        }
    }
}


[此贴子已经被作者于2017-4-1 13:34编辑过]

2017-04-01 13:13
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:18 
p 和*p  永远都不能一样  

光看形参 也没啥意义  还是用例子来说话  

DO IT YOURSELF !
2017-04-01 13:23
Emotiona
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:311
专家分:581
注 册:2017-3-7
收藏
得分:0 
回复 2楼 wp231957
编辑了下帖子
2017-04-01 13:35
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
有些问题  再想想

[此贴子已经被作者于2017-4-1 14:10编辑过]


DO IT YOURSELF !
2017-04-01 13:56
Emotiona
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:311
专家分:581
注 册:2017-3-7
收藏
得分:0 
回复 3楼 Emotiona
查了下。
a是行指针,a是指向a[0]这个首地址,而a是int(*)型,也就是数组指针。而a[0]这个数组指针,又有a[0],a[1],a[2]这些元素,a[0], a[1], a[2]是int *型,相当于一维的数组。   你改的**p 和 (*p)[]的意思差不多,行指针就是一个数组指针, 列指针就是一个一维的数组可以这么看。 谢谢你的回答。  
之所以指针用(*a,&a[0],&a[0][0],a[0])数组用(a, a[0])来表示就不难理解了。a[0]两者都能用,编译器不会报错,可能分不清a[0]的类型。不知道vs. vc编译会不会有问题

[此贴子已经被作者于2017-4-1 14:29编辑过]

2017-04-01 14:23
快速回复:[疑问]二维数组a[][], a和*a的区别
数据加载中...
 
   



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

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