鱼C论坛

 找回密码
 立即注册
查看: 3120|回复: 4

illegal indirection的疑惑

[复制链接]
发表于 2015-9-5 21:03:11 | 显示全部楼层 |阅读模式
30鱼币
/*有四个学生,每个学生有四科的成绩,该程序功能是找出有不及格成绩的学生*/


#include <stdio.h>

void main()
{
    double score[][4] = {{60.0, 70.0, 80.5, 90.5}, {56.0, 89.0, 67.0, 88.0}, {34.2, 78.5, 90.0, 68.5}, {66.0, 78.0, 88.0, 97.0}};
   
    void search(double(*point)[4]);                 /*以指针变量做形参*/

    search(score);                                             /*调用查找函数*/
}

void search(double(*pointer)[4])
{
    int i, j;
    double *pt;
    pt = *pointer;                                            /*i是学生号,从0到3*/
    for(i = 0; i < 4; i++)
    {
          for(j = 0; j < 4; j++)                           /*j是每个学生每科成绩,从0到3*/
          {
                if(*(*(pt + i) + j) < 60)
                {
                      printf("the failed score number is score[%d]\n", i);
                      printf("\n");
                      break;
                }
          }

    }
   
}

编译过后在 printf("the failed score number is score[%d]\n", i); 出现illegal indirection;

如果将search 函数换成以下形式则不会,怎么回事?
void search(double(*pointer)[4])
{
    int i, j;
    double *pt;
    pt = *pointer;                                            /*i是学生号,从0到3*/
    for(i = 0; i < 4; i++)
    {
          for(j = 0; j < 4; j++)                           /*j是每个学生每科成绩,从0到3*/
          {
                if(*(*(pt + i) + j) < 60)
                {
                      printf("the failed score number is score[%d]\n", i);
                      printf("\n");
                      break;
                }
          }

    }
   
}

最佳答案

查看完整内容

ps 对于指针 楼主记住这句经典的话 可以加深对指针的理解 无论二级三级指针 还是n级指针 都遵循这个规律 指针的类型 决定了指针的视野 指针的视野决定了指针的步长 int* p, p是一个一级指针, 每次加1或减1, 移动的是一个int大小的步长, int** pp, pp是一个二级指针, 每次加1移动的是一个数组(int*)的大小, *pp自然也就是一个一级指针, 每次移动一个int大小, 距离例子 我如果要取第5行第10个元素, 就是*(*(pp+4)+9)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-9-5 21:03:12 | 显示全部楼层
ps 对于指针 楼主记住这句经典的话 可以加深对指针的理解 无论二级三级指针 还是n级指针 都遵循这个规律
指针的类型 决定了指针的视野 指针的视野决定了指针的步长
int* p, p是一个一级指针, 每次加1或减1, 移动的是一个int大小的步长,
int** pp, pp是一个二级指针, 每次加1移动的是一个数组(int*)的大小, *pp自然也就是一个一级指针, 每次移动一个int大小, 距离例子 我如果要取第5行第10个元素, 就是*(*(pp+4)+9)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-9-5 22:08:19 | 显示全部楼层
double *pt;这个是pt的定义
*(*(pt + i) + j)等价于pt[i][j]

其中pt[i]是double 类型,所以pt[i]后面再跟着[j]就存在语法错误。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-9-6 10:41:50 | 显示全部楼层
函数serch中
double* pt 改         double(*pt)[4] ;
pt = pointer;

void search(double(*pointer)[4])
{
        int i, j;
        double(*pt)[4] ;
        pt = pointer;                                            /*i是学生号,从0到3*/

        for(i = 0; i < 4; i++)
        {
                for(j = 0; j < 4; j++)                           /*j是每个学生每科成绩,从0到3*/
                {
                        if(*(*(pt + i) + j) < 60)
                        {
                                printf("the failed score number is score[%d]\n", i);
                                printf("\n");
                                break;
                        }
                }

        }

}


1.png

这应该是楼主想要的结果
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2015-9-6 21:40:25 | 显示全部楼层
ryxcaixia 发表于 2015-9-6 10:48
ps 对于指针 楼主记住这句经典的话 可以加深对指针的理解 无论二级三级指针 还是n级指针 都遵循这个规律
...

谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-26 09:37

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表