我很好奇如何将指针作为参数传递给函数中的指针。我检查了不同的问题,例如 - C: How to pass a double pointer to a function,有人讨论为了将指针传递给指针,你需要将指针传递给指向指针的指针。例如 如果我有
char **lines= malloc(sizeof(char) * MAXWORDNUM);
int y;
for (y = 0; y < MAXWORDNUM; y ++)
{
lines[y] = malloc(sizeof(char) * MAXWORD);
}
我是否需要声明一个函数
func(char ***lines)
? 在我的代码中,我以下列方式创建了一个函数 -
func(char *lines[])
它仍然适用于
**lines
那么这两种方式有什么区别?创建功能是否正确 **行的func(char * lines [])?
答案 0 :(得分:2)
声明的函数,例如
some_type func(char ***lines);
接受一个参数,该参数是指向指向char
的指针的指针。
诸如
之类的功能some_type func(char *lines[]);
找到一个指向char
指针的参数。换句话说,它与
some_type func(char **lines);
我希望你看到差异?
对于第一个函数,表达式**lines
是指向char
的指针,但对于第二个函数,相同的表达式是 a char
。
如果你想通过引用传递模拟指针指向某种类型的指针,并在函数中分配矩阵,那么第一个是你应该做的:
void func(char ***lines)
{
*lines = malloc(sizeof(char*) * MAXWORDNUM);
for (int i = 0; i < MAXWORDNUM; ++i)
(*lines)[i] = malloc(MAXWORD);
}
请注意,在循环中,您必须在*lines
周围使用括号,因为索引运算符[]
的{{3}}比解除引用运算符*
。
当你调用它时,你不会传递一个声明为tripple-pointer的变量,而是传递一个双指针的地址(使用address-of operator一元&
): / p>
char **lines;
func(&lines);
答案 1 :(得分:1)
func(char *lines[])
和func(char **lines)
之间没有太大区别。两者都代表2D阵列。
让我用一个简单的例子来解释你。
#include<stdio.h>
// function for printing the char 2D array
void PRINT(char **array,int r) //here i am catching with char **
{
int i;
for(i=0;i<r;i++)
printf("%s\n",p[i]);
}
main()
{
char *array[]={"one","two","three"}; // for example i am taking 3 string. you can get these from user also after allocating memory dynamically.
PRINT(array,3); //were 3 is the no of strings.
}
在此功能中,我正在使用char *[]
void PRINT(char *array[],int r)
{
int i;
for(i=0;i<r;i++)
printf("%s\n",p[i]);
}
对于这两种情况,输出应为
one
two
three
char **array
和char *array[]
的行为相同。它们之间没有太大差异。