【问题标题】:Iterating pointer to array of pointers in K&R迭代指向 K&R 中指针数组的指针
【发布时间】:2016-01-31 00:23:57
【问题描述】:

在 K&R 的第 109 页显示了使用指向指针数组的指针迭代编写的 writelines 函数:

void writelines(char *lineptr[], int nlines)
{
    while(nlines-- > 0)
        printf("%s\n", *lineptr++);
}

问题:只能通过函数调用以这种方式进行迭代,其中未指定指向 char 数组的指针大小吗?

如果我尝试在 main() 中进行测试,通过创建 char 数组指针,我必须指定大小。然后当我尝试 while 循环时,我收到错误消息:

Cannot increment value of type *char[2]

这是来自 main() 的测试代码:

char line[4] = "The";
char line2[8] = "dog ran";
char *p;
char *q;
char *mylinepointer[2];

p = alloc(10);
q = alloc(10);

strcpy(p, line);
strcpy(q, line2);

mylinepointer[0] = p;
mylinepointer[1] = q;

int nlines = 2;
while (nlines-- > 0)
    printf("%s\n", *mylinepointer++);

【问题讨论】:

  • 如果你仔细看这个例子,*lineptr[] 传递了指针数组,nlines 给出了多少。迭代只是减少了nlines,它仅用作计数器,因为依次打印每个指针。不需要知道每个字符串的长度,字符串是 nul-terminated (表示每个字符串的结束位置)。不需要指定数组的长度,可以初始化为char line[] = "The";

标签: c arrays pointers iteration


【解决方案1】:

mylinepointer 是一个由 2 个字符指针组成的数组。本声明

printf("%s\n", *mylinepointer++);

尝试修改一个数组。您不能修改数组。数组是不可修改的左值。当您将数组传递给函数时,它会在指针的副本上进行操作。所以指针算术有效。 在main() 中打印的等效方法是指向指针:

int nlines = 2;
char **tmp = mylinepointer;

while (nlines-- > 0)
    printf("%s\n", *tmp++);
}

【讨论】:

  • 谢谢。你能告诉我为什么这在 writelines 的迭代中不起作用吗?:while(nlines-- > 0) printf("%s\n", *lineptr[nlines]);
  • 对函数的调用必须是数组,这很令人困惑。如果我尝试使用数组表示法进行迭代,它会失败。 (例如,*lineptr[i++]、*lineptr[nlines] 等)。任何其他信息将不胜感激。
  • *(取消引用运算符)进行一级间接。 printf("%s\n", *lineptr[nlines]); 不起作用,因为 *lineptr[nlines] 是单个 char,因此您不能将其打印为 string(使用 %s)而 lineptr[nlines]是一个指针,指向第一个字符串。最好阅读有关数组与指针的信息,它们在许多上下文中的行为方式等。我建议在此处阅读相关部分:c-faq.com 并在 SO 上搜索数组与指针。这是external link
  • 您可能会有更多问题。所以最好自己学习一本教科书,自己尝试一些简单的例子,看看它是如何工作的。
  • 谢谢。我正在努力 :) 感谢您的彻底帮助!
猜你喜欢
  • 2018-09-04
  • 2019-08-24
  • 1970-01-01
  • 1970-01-01
  • 2020-03-01
  • 2016-07-30
相关资源
最近更新 更多