2

我有一个简单的问题..我有一个 C 程序..我有一个 long 数组,我想将指向该数组的指针传递给两个函数。以这种方式传递数组是否正确?

long[] myArray


void myFunction1(long *myArray[]){

*myArray[0] = 1;

}

void myFunction2(long *myArray[]){

*myArray[1] = 2;

}

这是正确的吗?

4

3 回答 3

2

不,这是不正确的,因为当您声明这样的变量时 -

long *myArray[]

它表示一个可以保存长指针的数组,而不是长值。我猜(从你的函数体)这不是你打算做的。

将您的函数参数更改为long myArray[],并分配不带星号的值。

像这样 -

void myFunction1(long myArray[]){
    myArray[0] = 1;
}

void myFunction2(long myArray[]) {
    myArray[1] = 2;
}

或者,如果您喜欢使用指针,那么 -

void myFunction1(long *myArray){
    myArray[0] = 1;
}

void myFunction2(long *myArray) {
    myArray[1] = 2;
}

在这两种情况下,请记住确保数组的大小至少为 2。

于 2013-05-08T17:11:06.380 回答
2

好吧,让我们考虑一下:

long myArray[3]; // This is an array of 3 long's

long *myArray[3]; // Is this? No, this is an array of 3 pointers to longs.

这几乎告诉你答案。

void myFunction1(long *myArray[]){

这不是将数组传递给函数(长或其他)的方式。你只需要一个数组:

void myFunction1(long myArray[]){
    myArray[0] = 1;

或者你可以拿一个指针:

void myFunction1(long *myArray){
    myArray[0] = 1;

这是有效的,因为数组衰减为指针。

于 2013-05-08T17:13:49.273 回答
1

当您声明时void myFunction1(long *myArray[]),我怀疑您犯了两个错误。

一是我认为您打算将其作为指向数组的指针。但是,括号 ,与标识符 , 的绑定比星号 ,[]更紧密。所以参数是,它是一个指向 的指针数组,但我认为您想要一个指向 的数组的指针,这将是。myArray*long *(myArray[])longlonglong (*myArray)[]

实际上,您可以使用此参数声明函数,将指针传递给数组,就像使用 一样myFunction1(&myArray),并在函数内部使用指针,就像使用(*myArray)[0] = 1;.

然而,C 给了我们一个捷径,不使用它是第二个错误。如果将参数声明为long myArray[],则它看起来像一个数组,但实际上转换为long *myArray,它是指向 的指针long。然后你可以将数组作为myFunction1(myArray). 虽然myArray是一个数组,但 C 将它转换为指向第一个元素的指针。所以参数myArray将匹配参数long myArray[]。然后,在函数内部,您可以将指针与myArray[0] = 1;.

快捷方式导致符号更短,通常被认为是更自然的符号,因此是首选。

于 2013-05-08T17:21:32.757 回答