通过引用将字符串数组传递给C函数

时间:2011-03-04 03:54:29

标签: c pass-by-reference arrays

我很难通过引用将字符串数组传递给函数。

  char* parameters[513]; 

这是否代表513个字符串?以下是我初始化第一个元素的方法:

 parameters[0] = "something";

现在,我需要通过引用将'参数'传递给函数,以便函数可以向其添加更多字符串。函数头如何看起来如何在函数内部使用这个变量?

2 个答案:

答案 0 :(得分:17)

你已经知道了。

#include <stdio.h>
static void func(char *p[])
{
    p[0] = "Hello";
    p[1] = "World";
}
int main(int argc, char *argv[])
{
    char *strings[2];
    func(strings);
    printf("%s %s\n", strings[0], strings[1]);
    return 0;
}

在C中,当您将数组传递给函数时,编译器会将数组转换为指针。 (数组“衰减”成指针。)上面的“func”完全等同于:

static void func(char **p)
{
    p[0] = "Hello";
    p[1] = "World";
}

由于传递了指向数组的指针,因此在修改数组时,您将修改原始数组而不是副本。

您可能想要了解指针和数组如何在C中工作。与大多数语言不同,在C中,指针(引用)和数组在很多方面都被类似地对待。数组有时会衰减为指针,但仅限于非常特定的情况。例如,这不起作用:

void func(char **p);
void other_func(void)
{
    char arr[5][3];
    func(arr); // does not work!
}

答案 1 :(得分:0)

char* parameters[513];是一个包含513个char指针的数组。它相当于char *(parameters[513])

指向该事物的指针属于char *(*parameters)[513]类型(相当于char *((*parameters)[513])),因此您的函数可能如下所示:

void f( char *(*parameters)[513] );

或者,如果你想要一个C ++引用:

void f( char *(&parameters)[513] );