【问题标题】:Pointer to pointer as a function argument in C ( func(type ***arg) vs func(type *arg[]) )指向指针作为 C 中的函数参数的指针( func(type ***arg) 与 func(type *arg[]) )
【发布时间】:2014-07-19 11:17:31
【问题描述】:

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

【问题讨论】:

  • 这个函数调用是个大问题:malloc(sizeof(char) * MAXWORDNUM);,因为sizeof(char)sizeof(char*)不一样。
  • 对您链接的问题 (stackoverflow.com/questions/4339201/…) 的接受答案向您展示了如何解决您的问题。我倾向于关闭您的问题,因为它与您链接的问题重复。请解释您的问题为何不同。
  • @alk 链接问题无法解决我的问题,即 func(char ***lines) 和 func(char *lines[]) 之间有什么区别。我解释说,在我的代码中,我使用了与链接问题中描述的不同的方式 - 它有效。我的问题是两种方式的比较,而链接的问题只是关于如何传递双指针......

标签: c pointers


【解决方案1】:

一个函数声明如

some_type func(char ***lines);

接受一个参数,该参数是一个指向char的指针的指针。

一个函数如

some_type func(char *lines[]);

获取一个指向char 的指针的参数。也就是说,和

some_type func(char **lines);

希望你能看出区别?

对于第一个函数,表达式**lines 是一个指向char 的指针,但对于第二个函数,同样的表达式一个char


如果你想用指向某种类型的指针来模拟通过引用传递,并在函数中分配矩阵,这是你应该做的第一个:

void func(char ***lines)
{
    *lines = malloc(sizeof(char*) * MAXWORDNUM);
    for (int i = 0; i < MAXWORDNUM; ++i)
        (*lines)[i] = malloc(MAXWORD);
}

请注意,在循环中,您必须在 *lines 周围使用括号,因为索引运算符 operator precedence[] 比取消引用运算符 * 的要多。

当您调用它时,您不会传递声明为三指针的变量,而是传递双指针的地址(使用地址运算符一元 &amp;):

char **lines;
func(&lines);

【讨论】:

  • 好的,谢谢。我做了一些不同的事情......奇怪的是,但它奏效了。不知道为什么。但感谢您展示正确的方式
【解决方案2】:

func(char *lines[])func(char **lines) 之间没有太大区别。两者都代表二维数组。 让我用一个简单的例子来解释一下。

#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[] 的行为相同。它们之间没有太大区别。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多