如何将单个指针指定为双指针

时间:2018-05-28 20:49:01

标签: c arrays pointers

所以我看到了这个例子:

Intent i = new Intent(MainActivity.this, NextActivity.class);
finish();  
startActivity(i);

loop_pipe()是一个操作多个管道参数的函数。但是已经定义了插入到cmd中的此代码上的变量。 在我的个人代码中,我试图做相反的事情,创建变量,将参数插入变量,然后将其添加到cmd。但是没有发生的是“增加”需求。例如,代码如下所示:

int main()
{
  char *ls[] = {"ls", NULL};
  char *grep[] = {"grep", "pipe", NULL};
  char *wc[] = {"wc", NULL};
  char **cmd[] = {ls, grep, wc, NULL};

  loop_pipe(cmd);
  return (0);
}

我猜错了(因为它不起作用)但是没有使用索引设置插入位置足以在我的双指针内分配数组指针?如果没有,有人可以帮我清楚如何分配这样吗?

EDIT1:

我的代码简化如下:

*(cmd[pipe_count]) = arg;

1 个答案:

答案 0 :(得分:2)

您可以将char **cmd[]视为包含char **元素的数组。因此,您可以为其分配char **个元素。

cmd[i] = arg;

就这么简单。它与整数数组没什么不同。

// "foo" is a `const char[]`. So an array of them is a `const char *[]`
const char *ls[] = {"ls", NULL};
const char *grep[] = {"grep", "pipe", NULL};
const char *wc[] = {"wc", NULL};

// To store an array of `const char *[]` we need a `const char **[]`.
const char **cmd[10] = {NULL};

cmd[0] = ls;
cmd[1] = grep;
cmd[2] = wc;

更详细......

为简单起见,本示例的其余部分将同等对待char *[]char **。有一些微妙的差异,但就我们的目的而言,它们并不重要。我们会将lsgrepwc视为char **指针,将cmd视为char ***

char **cmd[10]stack上的10个char **指针分配空间。 char **与任何其他指针的大小相同。我们假设64位整数或8个字节。其中10个意味着它分配80个字节。 cmd本身是char ***指针。这只对编译器有意义进行类型检查。最终,所有cmd包含的是64位整数,表示内存中的位置。

lsgrepwc相同。它们的类型为char **,它只是一个64位整数,表示内存中的位置。

cmd[0] = ls表示从cmd的地址开始,以0 char **指针的大小(因此为0)前进,然后分配包含在其中的char **指针ls到该位置。因此,如果cmd位于内存位置100,则会写入100到107。

cmd[1] = grep表示从cmd的地址开始,100。按1 char **个指针的大小前进,8。然后分配char **指针中包含的grep指针{1}}到该位置。所以100 + 8是108.然后将8个字节写入108到115。

cmd[2] = grepgrep中的64位数写入内存位置100 +(2 * 8)或116到123.

等等。它适用于任何指针数组。或指针指针。它只是一个奇特的整数数组。