2

我需要将字符指针数组的地址传递给函数,正确的函数声明/原型语法是什么?

我试过了:

    void myFunc(char &*a[]);

但得到一个预期;, 或 ) 之前 & 错误。

我也试过:

    void myFunc(char **a);

由于我要传入的指针确实是指向指针的指针,但我又遇到了另一个错误。这次错误与: expected char **, but gotchar *[]

或类似的东西。此后我尝试了其他解决方案,所以我不记得确切的错误。

有什么建议么?

4

6 回答 6

4

假设您有一个声明为的数组

char *a[N];

并且您想将指针传递给数组,如

foo( &a );

那么原型foo需要是

void foo( char *(*aptr)[N] );

请注意,在这种情况下,必须声明数组的大小;指向 N 元素数组的指针与指向 M 元素数组的指针是不同的类型。

通常,您不想这样做;相反,您通常只需像这样传递数组表达式:

foo ( a );

相应的原型将是:

void foo ( char **aptr );

除非它是sizeof或一元运算符的操作数&,或者是用于在声明中初始化另一个数组的字符串文字,否则“N 元素数组T”类型的表达式将被转换(“衰减”)为键入“pointer to T”,表达式的值将是数组第一个元素的地址。

于 2013-10-01T19:37:11.373 回答
2

修改后的问题陈述的更新答案

鉴于您在评论中所说的,没有必要将指针传递给数组。您可以简单地将指针传递给数组的第一个元素。这样的指针就足够了,因为数组的其余元素显然位于第一个元素之后。

要编写一个将指针设置为指向 的数组中的指针的函数char,请执行以下操作:

void MyFunction(int NumberToSet, char *Pointers[])
{
    for (int i = 0; i < NumberToSet; ++i)
    {
        Pointers[i] = SomeString;
    }
}

在上面,SomeString必须有类型“pointer to char”。这可以是一个字符串,例如"Hello",或者一个数组char(它会自动转换为指向 的指针char),或者是某个x已被声明为char *x(并且已被初始化或分配)的标识符,例如。

要使用此函数,请像这样调用它:

char *MyArrayOfPointers[SomeNumber];
MyFunction(NumberOfPointersIWantToSet, MyArrayOfPointers);

原始答案

在大多数情况下,要传递指向函数的指针数组,char只需传递第一个元素的地址即可。在这种情况下,您将使用其中任何一个(它们是等效的):

void myFunc(char **a)
void myFunc(char *a[])

如果你真的想传递数组的地址,你可以使用:

void myFunc(char *(*a)[])

在这种情况下,类型a不完整,因为缺少维度。根据您打算使用的用途a,您可能需要在声明中提供维度。

当调用myFunc并传递一些声明为的数组时char *array[N];,您将传递它,在前一种情况下,作为myFunc(array),在后一种情况下,作为myFunc(&array)

于 2013-10-01T18:45:48.533 回答
1

尝试将其作为函数定义void myFunc(char *a[])void myFunc(char **a)然后以这种方式使用它:

char *arr[20];
myFunc(arr);
于 2013-10-01T18:33:47.653 回答
1

宣言

void myFunc(char &*a[]);  

不是有效的 C 语法。
要传递字符指针数组的地址,请改用它

void myFunc(char *(*a)[]);   

*(*a)[]在上面的函数中声明a为指向chars的指针数组的指针。必须注意a具有不兼容的类型。需要一个后缀[]才能使其完整。

于 2013-10-01T18:33:49.207 回答
1

好的,你几乎是在正确的道路上。void myFunc(char *a[]);

例子

void fun(char *a[]){
    printf("%s",*a);    //for accessing the next element do a+1
    }

int main(void) {
    char *x[3];
    x[0]="abcd";
    fun(x);   // here you are passing the address first array element 
    return 0;

演示

于 2013-10-01T18:35:23.437 回答
-1

首先,C 通常是一种“通过引用传递”的语言。一些数据项,如整数、浮点数和单个字符可以按值传递。但是,这些相同数据类型的数组总是通过引用传递。

因此,当您说“我需要将字符指针数组的地址传递给函数”时,只需在函数原型中将字符指针数组声明为:

void myFunc(char *a[]);

因此,char *声明一个 char 指针并a[]定义它们的数组。要检查此声明,请参阅:http ://www.cdecl.org/ ,它将此表达式解析为“将 a 声明为指向 char 的指针数组”。

技术要点是*绑定 withchar而不是 with a[]

因此,C 将传递一个指向您声明的数据结构的指针。关于这个主题的讨论可能会深入探讨双指针,但对于这个问题,这样的讨论可能是题外话。

于 2013-10-01T20:41:54.830 回答