C 如何声明函数以接受指向int数组的指针

C 如何声明函数以接受指向int数组的指针,c,C,很抱歉,如果这看起来像是一个大一新生的CS问题,但我正在尝试学习一些客观的c和复习指针,并且我正在尝试传递一个指向int数组的指针(请参阅所有caps注释以了解问题-注意,我可能真的对这一切的工作原理感到困惑;我保证我曾经知道它) 我有: int (*d)[]; //a pointer to an array of ints. int e[3]={12,45,789}; d=&e; // works a=g(d); NSLog(@"here is %i", a); ... //

很抱歉,如果这看起来像是一个大一新生的CS问题,但我正在尝试学习一些客观的c和复习指针,并且我正在尝试传递一个指向int数组的指针(请参阅所有caps注释以了解问题-注意,我可能真的对这一切的工作原理感到困惑;我保证我曾经知道它)

我有:

int (*d)[];  //a pointer to an array of ints.
int e[3]={12,45,789};

d=&e; // works
a=g(d);
NSLog(@"here is %i", a);
...

//  THIS PART IS THE PROBLEM
// trying to declare for passing a pointer array of ints
int g(int []); // no
int g(int *[]); // no
int g(int (*)[]); // no

int g(myArray){ // ERROR conflicting types for g
    return 2313459;
}
我将如何声明此函数以接受指向int数组的指针(或者是否还有其他我想做的事情)


thx

您可以通过指向数组的指针或指向第一个元素的指针传递数组。样本包括:

#include <stdio.h>

int g(int (*A)[])   //  A is a pointer to an array.
{
    return (*A)[1];
}

int h(int A[])      //  A is a pointer to the first element.
{
    return A[1];
}

int main(void)
{
    int (*d)[];
    int e[3] = { 12, 45, 789 };
    d = &e;
    printf("%d\n", g(d));   //  Pass a pointer to the array.
    printf("%d\n", g(&e));  //  Pass a pointer to the array.
    printf("%d\n", h(*d));  //  Pass a pointer to first element.
    printf("%d\n", h(e));   //  Pass a pointer to first element.
    return 0;
}
#包括
int g(int(*A)[])//A是指向数组的指针。
{
申报表(*A)[1];
}
int h(int A[])//A是指向第一个元素的指针。
{
返回[1];
}
内部主(空)
{
int(*d)[];
int e[3]={12,45,789};
d=&e;
printf(“%d\n”,g(d));//传递指向数组的指针。
printf(“%d\n”,g(&e));//传递指向数组的指针。
printf(“%d\n”,h(*d));//传递指向第一个元素的指针。
printf(“%d\n”,h(e));//传递指向第一个元素的指针。
返回0;
}

您为声明
g
的各种方式写下“否”,但不解释您认为其中任何一种都不可接受的原因。第一个通常用于通过传递数组的第一个元素的地址而不是通过传递数组本身来传递数组。第二个是错误的,因为它将参数声明为指针数组。如果您希望传递指向数组的指针,则第三个是正确的,这是您以前的代码
d=&e
a=g(d)可以。为什么您认为第三种方法不起作用?您为什么尝试这样做?这与Obj-C有什么关系?您不需要为
g
指定数组的大小吗?那么,它不应该是
intg(int(*A)[3])
?或者Obj-C在这方面比C宽松?@JohnBode:这个尺寸不需要,因为它没有被使用。表达式
(*A)[1]
立即取消引用
A
,生成指向未知大小数组的指针,该数组将自动转换为指向
int
的指针。它在Apple GCC 4.2.1中使用
-pedantic
-std=c99
编译时没有问题。奇怪的是,人们可能认为
A[0][1]
是等效的,但根据定义,
(*(A+0))[1]
,而
A+0
中的指针算法名义上需要大小(C 2011[N1570]6.5.6 1“或一个操作数应该是指向完整对象类型的指针…”),因此GCC报告了一个错误。