1

可能重复:
gcc 编译错误:cast 指定数组类型

我想检查 (int * ) 和 (int []) 的区别。当我编译以下代码时,第一行正常。但是对于第 2 行,我的编译器给出了以下错误:

test.c:10: error: cast specifies array type

谁能告诉我这个错误的含义以及我在哪里做错了?

#include<stdio.h>

void abc(int *a)
{
        int i;
        for(i=0;i<2;i++)
        {
            printf("%d",((int * )a)[i]);  //(1)
            printf("%d",((int [])a)[i]); //(2)
        }
}

int main()
{
    int b[2]={0,1};
    abc(b);
    return 0;
}
4

3 回答 3

8

通常int *是一个指针(指向一个整数)并且int[]是一个未指定大小的数组,即所谓的不完整类型。不完整类型只能在声明中使用,并且必须在定义中完成。例如(以下代码位于全局范围内):

extern int[] p; //declaration of p

int p[5]; //definition of p - size must be specified

当您谈论函数参数时,情况就完全不同了。声明:

void f(int *p)

void f(int p[])

将是相同的。如果你愿意,它只是语法糖。


编辑:除此之外:如果您要问数组和指针之间有什么区别:一切!我会将您链接到C-faqs.com以获得更具体的答案。

于 2012-04-28T10:52:27.040 回答
1

试试这个

void abc(int *a){ 
  int i; 

  for(i=0;i<2;i++){
     printf("%d",*(a+i));  //(1)
     printf("%d", a[i]);   //(2) 
  } 
} 

你应该花更多的时间来理解指针和数组。数组的名称是指向他的第一个元素的指针,您可以使用数组的名称使用它们的名称,就像使用内存块和指向它的指针一样开始

于 2012-04-28T10:50:03.950 回答
0

一点也不。int * 表示指向内存中整数的指针。[] 括号代表一个数组。诠释一个[10];将创建一个包含 10 个整数的数组。诠释*一个;将创建一个指向整数的指针。

指针不是简单类型的好习惯,因为它们消耗更多内存。

有关更多答案,请查看:http ://www.cplusplus.com/doc/tutorial/arrays/和http://www.cplusplus.com/doc/tutorial/pointers/

于 2012-04-28T10:48:45.590 回答