[英]C pointer notation compared to array notation: When passing to function
我的问题基于以下代码:
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
}
是否有理由使用其中一个而不是另一个? 详细说明,当涉及数字数组时,是否有任何理由希望使用指针表示法而不是数组表示法。 如果使用指针表示法,则在函数中使用指针算术等。如果使用 [] 数组表示法,则可以像往常一样使用数组。 我是编程新手,目前我看不到使用指针表示法有任何好处。
我的确切问题是,是否有任何理由使用指针表示法将数字数组传递给函数,从而在函数内使用指针操作。
当您将函数参数声明为数组时,编译器会自动忽略数组大小(如果有)并将其转换为指针。 也就是说,这个声明:
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)
这两种表示法之间没有真正的功能差异。 在 C 中,当您将数组变量传递给函数时,无论表示法如何,它都会衰减为指针。 但是,在我看来,指针表示法更可取。 函数定义中[]
符号的问题在于,在我看来,它有点误导:
void foo(int array[])
{
}
新手 C 程序员普遍存在的错误是假设sizeof(array)
会给你sizeof(array)
中元素的数量乘以sizeof(int)
,就像array
是在堆栈上声明的数组变量一样。 但实际情况是,尽管[]
符号具有误导性, array
已衰减为指针,因此sizeof(array)
将是sizeof(int*)
。 array
实际上只是一个指向第一个元素的指针,或者可能是指向分配在任何地方的单个整数的指针。
例如,我们可以这样调用foo
:
int x = 10;
foo(&x);
在这种情况下, foo
定义中的[]
符号有点误导。
这些声明完全相同。 引用标准:
将参数声明为“类型数组”应调整为“类型的限定指针”
C99标准第6.7.5.3条第7款
在自 C99 以来具有可变长度数组的现代 C 中,如果是数组,则数组表示法更可取,我认为。 对于一维数组,您可以执行以下操作
int myfunct(size_t size, int array[size]) {
... array[i] ..
}
和二维
int myfunct(size_t size, int array[size][size]) {
... array[i][j] ..
}
所以数组符号更适合一般情况。 一个复杂的编译器甚至可以进行边界检查,但我还不知道有任何这样做的。
在我看来,在函数原型中更喜欢指针符号而不是空数组符号的主要原因是后者与结构定义不一致:
struct person {
char *firstname;
char *lastname;
};
void setperson(struct person *p, char firstname[], char lastname[])
{
p->firstname = firstname;
p->lastname = lastname;
}
在结构中,您无论如何都必须使用指针表示法,因为空数组表示法只对最后一个成员有效,至少从 C99 开始,当您想让它成为灵活的数组成员时。
您只需要对多维数组使用数组表示法。 (您不必提供第一个维度的大小)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.