阿撩 发表于 2016-11-4 21:33:17

求问这个程序是怎么回事?

编译之后出现一个错误
#include <stdio.h>
int main( )
{

        int a={1,3,5,7,9,11,13,15,17,19,21,23};
        int *p,i,j;
        p=a;
        for(i=0;i<3;i++)
        {
        for(j=0;j<4;j++)
        {
        printf("%d ",*(*(p+i)+j));
        }
        }
}

错误提示:F:\VC\MyProjects\e812\e812.c(12) : error C2100: illegal indirection

说是printf那一步不合法用得是VC6++ 是因为版本太低的缘故么?

求各位大神解答一下! 感谢~~

去瞧瞧 发表于 2016-11-4 23:35:15

int *p 改为int **p
二维数组是数组的数组,a是地址的地址

fc1735 发表于 2016-11-5 01:28:24

#include <stdio.h>
int main( )
{

      int a={1,3,5,7,9,11,13,15,17,19,21,23}; // a为指向int的 ,&a为指向3个 int的
      int *p,i,j;// p为指向int的
      p=a;
      for(i=0;i<3;i++)
      {
      for(j=0;j<4;j++)
      {
      printf("%d ",*(*(p+i)+j));   //p的跨度是4个byte,而由于编译器认定其为指向int的,取值后不为地址,无法再取值。
      }
      }
}

修正为: int (*p) ; //即为指向int的,跨度为16个byte,取值后地址不变(这是编译器的运作方式,在实质上没有差别) ,只是从指向int变到指向int,跨度变为4byte,再取值后就是int类型。

alltolove 发表于 2016-11-5 12:43:30

printf("%d ",*(*(p+i)+j));这句话有问题,*(p+i)+j是一个常量(就是一个数)就不能再对它用星号取值了

阿撩 发表于 2016-11-5 19:54:33

alltolove 发表于 2016-11-5 12:43
printf("%d ",*(*(p+i)+j));这句话有问题,*(p+i)+j是一个常量(就是一个数)就不能再对它用星号取值了

呃。。。可是p是指向一个二维数组,*(p+i)+j是等于p+j还是一个地址,再加上*才是值。。。然后我刚刚改了下,试着把定义*p改成了(*p)就能运行出来了,虽然不知道为什么。。。

阿撩 发表于 2016-11-5 19:55:21

阿撩 发表于 2016-11-5 19:54
呃。。。可是p是指向一个二维数组,*(p+i)+j是等于p+j还是一个地址,再加上*才是值。。。然后我刚刚改了 ...

*(p+i)+j是等于p+j还是一个地址

仰望天上的光 发表于 2016-11-5 20:52:10

第一个错误是 p=a;
什么破编译器只是给了warnning,但你没注意看吧?
这个错误没解决,继续往下想肯定想不明白

这里的正确代码见fc1735 贴的

阿撩 发表于 2016-11-25 19:26:55

fc1735 发表于 2016-11-5 01:28
#include
int main( )
{


谢谢谢谢~ 虽然不是特别懂 感觉自己还是有点懵 但是还是有认真看了初学者见谅 感谢~

四十二 发表于 2016-11-26 16:28:19

建议先别学这么细致的东西,以后再慢慢补充
页: [1]
查看完整版本: 求问这个程序是怎么回事?