2013-01-12 83 views
10

我的问题是基座上的以下代码:的C指针表示法相比数组符号:当传递到功能

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 

    } 

是否有一个原因使用这些中的一个比其他?详细说明一下,当关心数值数组时,是否有任何理由希望在数组表示法上使用指针表示法。如果使用指针表示法,那么在函数指针内将使用等号。如果使用[]数组表示法,可以像往常一样使用数组。我是编程新手,目前看不到使用指针表示法的好处。

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

回答

8

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

void foo(int array[]) 
{ 

} 

初学C程序员中无处不在的错误是假设sizeof(array)会给你数中的元素的数组乘以sizeof(int),就像array是在堆栈中声明的数组变量一样。但现实情况是,array已经衰减到一个指针,尽管误导[]表示法,所以sizeof(array)将是sizeof(int*)array实际上只是指向第一个元素的指针,或者可能是指向任何地方分配的单个整数的指针。

例如,我们可以称之为foo这样的:

int x = 10; 
foo(&x); 

在这种情况下,[]符号在foo的定义是一种误导。

+0

所以如果我使用* ary反对ary [],我可以在函数内使用ary [0]吗? – SystemFun

+0

@弗拉德,是............, –

+0

@弗拉德我以为你明白我的答案?无论上下文如何,'ary [0]'是'*(ary + 0)'都是'* ary'。如果你可以使用一个,你可以使用另一个(在表达式中,也就是)。 – melpomene

10

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

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) 
+0

我明白这一点。我的问题是指在该职能范围内进行的操纵。 – SystemFun

+1

@Vlad如果你的问题是关于函数的内部,为什么你的例子代码除了那个之外的其他所有代码呢? – melpomene

-1

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

1

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

的参数为“类型的阵列”的声明,应调整至 “合格指针输入”

C99标准节6.7.5.3第7段

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] .. 
} 

所以数组符号适合在一般的画面要好得多。一个复杂的编译器甚至可以进行边界检查,但是我还不知道这一点。

+0

请注意,在一维情况下,'int array [size]'与'int * array'具有相同的效果,即'array'仍然是一个指针,'size'是多余的,除了作为文档。在2-D情况下,'array'的类型是'int(*)[size]'。 –