2D数组作为参数

时间:2016-08-02 09:46:36

标签: c++ arrays

我读过一本关于C的书,我确实尝过,所以请跟我一起软。 我试图了解记忆是如何运作的。

我想要一些像这样的单词数组(在C中):

char builts[20][10]={"light","temp"}; //should it looks like this ?

然后,我想将该数组传递给一个函数(在另一个类中)

   //some class
    char  *builtinFunctions;
    void Intepreter::setBuiltIns( char *builtins)
    {
      //  here - should I save a copy to builtinFunctions ?? how ?

    }

另一个类需要始终访问该单词数组。 为什么会出错:intepreter.setBuiltIns(&builts);

如何声明builtinFunctions?作为pointerarray?它应该被复制到?

整个事情究竟应该是什么样子?

3 个答案:

答案 0 :(得分:4)

将2D数组传递给函数有多种方法:

参数是2D数组

int array[10][10];
void passFunc(int a[][10])
{
    // ...
}
passFunc(array);

该参数是一个包含指针的数组

int *array[10];
for(int i = 0; i < 10; i++)
    array[i] = (int*)malloc(40); //array[i] = new int[10];
void passFunc(int *a[10]) //Array containing pointers
{
    // ...
}
passFunc(array);

该参数是指针指针

int **array;
array = (int*)malloc(40);//array = new int *[10];
for(int i = 0; i <10; i++)
    array[i] = (int*)malloc(40); //array[i] = new int[10];
void passFunc(int **a)
{
    // ...
}
passFunc(array);

答案 1 :(得分:2)

将简单数组传递给函数时,将其作为指针传递(数组名称作为指向数组第一个元素的指针),如下所示:

int foo[3] = { 3, 2, 1 };
bar(foo);

因此,您的函数将指向int的指针作为参数:

void bar(int *data) { }

这里有一个数组,其中包含 NULL终止的长度为10的字符串,它们也是数组。所以,builts是指向他的第一个元素的指针,所以指向10 char数组的指针:

char builts[20][10] = {"light", "temp"};
char (*foo)[10] = builts; // This is valid, foo is a pointer to an array of 10 char

因此,您的函数必须使用char (*)[10]类型的参数,因为您将指针传递给10 char的数组:

void bar(char (*data)[10]) { }

答案 2 :(得分:0)

您可以在调用函数时使用其名称来传递2天数组,例如:

test_2d(builts);

您可以将单词总数作为单独的参数传递,也可以使用特殊单词来表示数组的结尾。例如,我使用了一个特殊的单词"\0"来表示这标志着数组的结束。总的来说代码看起来像。

#include<stdio.h>
#include<string.h>

int main(void)
{
    char builts[20][10]={"light","temp", "\0"};
    test_2d(builts);        /* without passing total number of args; depends on special word at the end */
    test_2d_num(builts, 2); /* also pass total num of elements as argument */
    return 0;
}

/* This needs a special word at the end to indicate the end */
void test_2d(char builts[][10])
{
    int i;
    char tmp[10];

    /* just print the words from word array */
    for (i=0; *builts[i] != '\0'; i++ )
            printf("%s\n", builts[i]);

    /* also try copy words to a tmp word and print */
    for (i=0; *builts[i] != '\0'; i++ ) { 
            strcpy(tmp, builts[i]);
            printf("%s\n", tmp);
    }

    /* Do something */
}

/* Also get total number of elements as a parameter */
void test_2d_num(char builts[][10], int tot_elem)
{
    int i;

    /* Process each word from the array */
    for (i = 0; i < tot_elem; i++) {
         printf("%s\n", builts[i]);
         /* Do something */
    }
}

请注意,此功能只能处理builts[][10],而不是builts[][11]builts[][9]等数组。

如果你想要一个通用函数,那么你需要在char *arr[]中存储单个单词的地址,并将这个数组传递给函数。像

int main()
{
     /* store the addresses of individual words in an `char *arr[] */
     char *arr[] = {"hello", "this", "that", NULL};

     test_2d_gen(arr);
     return 0;
}

void test_2d_gen(char *arr[])
{
     int i;

     /* process each word */
     for (i = 0; arr[i] != NULL; i++) {
         printf("%s\n", arr[i]);

     /* Do something */
     }
}