正确的“地址”字符指针数组的C语法?

时间:2013-10-01 18:30:06

标签: c arrays pointers

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

我试过了:

    void myFunc(char &*a[]);

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

我也尝试过:

    void myFunc(char **a);

由于我传入的指针确实是一个指向指针的指针,但是我得到了另一个错误。这次错误与预期char **有关,但得到char *[]

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

有什么建议吗?

6 个答案:

答案 0 :(得分:4)

假设您有一个声明为

的数组
char *a[N];

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

foo( &a );

然后foo的原型需要

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

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

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

foo ( a );

并且相应的原型将是:

void foo ( char **aptr );

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

答案 1 :(得分:2)

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

鉴于你在评论中所说的内容,不需要传递指向数组的指针。您只需将指针传递给数组的第一个元素即可。这样的指针就足够了,因为数组的其余元素显然位于第一个元素之后。

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

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

在上文中,SomeString必须具有“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),在后一种情况下传递为{{1} }}

答案 2 :(得分:1)

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

char *arr[20];
myFunc(arr);

答案 3 :(得分:1)

声明

void myFunc(char &*a[]);  

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

void myFunc(char *(*a)[]);   
上述函数中的

*(*a)[] a声明为指向char s 指针数组的指针。必须注意a具有不兼容的类型。 []需要后缀才能完成。

答案 4 :(得分: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;

<强> DEMO

答案 5 :(得分:-1)

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

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

void myFunc(char *a[]);

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

技术要点是*char绑定,而不是与a[]绑定。

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