指针作为C中的函数参数的指针(func(类型*** arg)vs func(类型* arg []))

时间:2014-07-19 11:17:32

标签: c pointers

我很好奇如何将指针作为参数传递给函数中的指针。我检查了不同的问题,例如 - 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 [])?

2 个答案:

答案 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 **arraychar *array[]的行为相同。它们之间没有太大差异。