【问题标题】:is (int *) and (int []) the same? [duplicate](int *) 和 (int []) 是一样的吗? [复制]
【发布时间】:2012-04-28 10:43:44
【问题描述】:

可能重复:
gcc compile error: cast specifies array type

我想检查 (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;
}

【问题讨论】:

  • 没有完全解决你的转换失败的原因,但stackoverflow.com/a/660812/567864 很好地解释了为什么int*int[] 不是同一个东西,以及它们在编译器内部的不同之处。

标签: c


【解决方案1】:

一般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 以获得更具体的答案。

【讨论】:

  • 谢谢Anthales...我得到了答案...:)
  • 在这种情况下,最好单击那个小接受按钮,这样其他人就知道这个问题已经解决了。我还注意到您的另一个问题有很多答案,但没有被接受的答案。
【解决方案2】:

试试这个

void abc(int *a){ 
  int i; 

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

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

【讨论】:

  • 我非常了解这些事情。但是当我们在函数中传递数组时。我们可以保留 int *a 或 int a[] 的形式参数吗? .为什么会这样?
  • @Anthales 在上面给了你很好的答案
【解决方案3】:

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

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

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

【讨论】:

  • 您能解释一下在使用指向简单类型的指针时更多的内存使用情况吗?
  • “它们消耗更多内存” - 你是指包含数据地址的 DWORDQWORD 的每个实例额外的 4 或 8 个字节?我想说的是指针很容易忘记清理它们(即free()它们)是一个更大的问题。
  • 是的,多项式已经说过人们伪造以释放它们,是的,它们消耗了额外的 4 或 8 个字节。如果没有必要,我为什么要额外的 4 或 8 个字节?
  • 是的,我同意你的观点,但是当我们在函数中传递数组时。我们可以保留 int *a 或 int a[] 的形式参数。你能详细说明这个问题吗?
  • 我认为他的意思是,例如,您不应该使用创建特定指针来处理 char[2] 数组。因为指针在不同的环境或编译器中有 8 个字节大小或 4 个。
猜你喜欢
  • 2021-09-25
  • 2014-09-29
  • 2017-06-06
  • 1970-01-01
  • 2011-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多