我读过一本关于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
?作为pointer
或array
?它应该被复制到?
整个事情究竟应该是什么样子?
答案 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 */
}
}