15

我的问题基于以下代码:

int myfunct(int ary[], int arysize)   
int myfunct2(int *ary, int arysize)

 int main(void){
   int numary[10];
   myfunct(numary, 10)
   myfunct2(numary, 10)
   return;
 }

int myfunct(int ary[], int arysize) {   
      //Whatever work is done

  }

int myfunct2(int *ary, int arysize) {
     // Whatever work is done

  }

是否有理由使用其中一个而不是另一个?详细地说,当涉及数值数组时,是否有任何理由要使用指针表示法而不是数组表示法。如果使用指针表示法,则将在函数中使用指针算术等。如果使用 [] 数组表示法,则可以像往常一样使用数组。我是编程新手,目前我认为使用指针表示法没有任何好处。

我的确切问题是,是否有任何理由使用指针表示法将数值数组传递给函数,因此在函数中使用指针操作。

4

6 回答 6

11

当您将函数参数声明为数组时,编译器会自动忽略数组大小(如果有)并将其转换为指针。也就是说,这个声明:

int foo(char p[123]);

100% 相当于:

int foo(char *p);

实际上,这与符号无关,而是与实际类型有关:

typedef char array_t[42];
int foo(array_t p);  // still the same function

p这与您在函数中的访问方式无关。此外,[]运算符不是“数组表示法”。[]是一个指针运算符:

a[b]

100% 相当于:

*(a + b)
于 2013-01-12T23:22:30.677 回答
9

这两种符号之间没有真正的功能差异。在 C 中,当您将数组变量传递给函数时,它会衰减为指针,而不管符号如何。但是,在我看来,指针表示法更可取。函数定义中符号的问题[]在于,在我看来,它有点误导:

void foo(int array[])
{

}

新手 C 程序员中一个普遍存在的错误是假设它sizeof(array)会给你数组中的元素数量乘以sizeof(int),就像array在堆栈上声明的数组变量一样。但现实情况是,尽管有误导性的符号,但它array已衰减为指针,因此将是. 实际上只是指向第一个元素的指针,或者可能是指向在任何地方分配的单个整数的指针。[]sizeof(array)sizeof(int*)array

例如,我们可以这样调用foo

int x = 10;
foo(&x);

在这种情况下[],定义中的符号foo有点误导。

于 2013-01-12T23:21:13.783 回答
3

这些声明是完全相同的。引用标准:

将参数声明为“类型数组”应调整为“限定类型指针”

C99 标准第 6.7.5.3 节第 7 节

于 2013-01-13T07:04:49.323 回答
0

我认为,在自 C99 以来具有可变长度数组的现代 C 语言中,如果是数组,则数组表示法更可取。对于一维数组,您可以执行以下操作

int myfunct(size_t size, int array[size]) {
  ... array[i] ..
}

对于二维

int myfunct(size_t size, int array[size][size]) {
  ... array[i][j] ..
}

所以数组表示法更适合一般情况。一个复杂的编译器甚至可以进行边界检查,但我不知道有任何这样做的。

于 2013-01-13T08:31:07.107 回答
0

在我看来,在函数原型中更喜欢指针表示法而不是空数组表示法的主要原因是后者与结构定义不一致:

struct person {
   char *firstname;
   char *lastname;
};

void setperson(struct person *p, char firstname[], char lastname[])
{
    p->firstname = firstname;
    p->lastname = lastname;
}

在结构中,无论如何您都必须使用指针表示法,因为空数组表示法仅对最后一个成员有效,至少从 C99 开始,当您想使其成为灵活数组成员时。

于 2019-09-27T08:04:21.077 回答
-1

您只需要对多维数组使用数组表示法。(您不必提供第一个维度的大小)。

于 2013-01-12T23:32:31.883 回答