0

我的帖子试图用 1 块石头杀死 2 只鸟。提前为无知道歉。

我正在尝试创建一个字符串数组,我可以index[0]或使用它ptr++来推进数组。我不确定是否应该创建一个char指针数组或指向数组的指针char。变量将存储在结构中。原谅我的无知,我只是很难确定何时何地使用的优先顺序()。我了解一个基本结构,就是当我开始使用指向字符串的指针时,我开始松散语法结构。如果我能理解它的语法,我可以将它进一步应用于数组的维度结构。

假设我对变量的分配是正确的,我想我宁愿使用ptr++类似printf("%s", ptr++). 如果我理解正确,ptr++会将指针移动到下一个字符串,或者一些 for ofptr++可以。这对吗?对于很多很多事情来说,这似乎会更快。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

struct Umbrella {
  char  *name[10]; 
} Umbrella;

int main ()
{
  struct Umbrella * ptr;

 // Not understanding this way... 
  ptr->name[0] = "Some name";

 // or this way. Well name++ as long as it wasn't the first string.
  ptr->name++ = "Some name";
  return 0;
}

引导说明:我已阅读 Prata 的“C Primer Plus”。他在解释事物方面做得很好,只是当您开始按照自己的意愿弯曲事物时,您才开始无法应用语法。例如,它从未涵盖使用指向结构的指针来访问多维数组,并且它没有涵盖以您实际使用它的语法方式的指针运算。任何人都可以推荐另一本书,至少可以通过这种方法进行钎焊吗?

PS 这是我的第二篇文章,我忘了说我真的很喜欢这个网站的文本输入设计。不得不说:-)。

4

1 回答 1

1

好吧,char *name[10]实际上就是这样:

char *name0;
char *name1;
char *name2;
// .. etc

按 as 访问它ptr->name[0]只会选择ptr->name0as char*

ptr->name++ = "asdf";这是一个非常糟糕的主意。它的基本作用是:

*(ptr->name) = "asdf";
ptr->name += 1;

当然,你不能在这里将 name 加一(它是一个数组,而不是一个指针),所以编译器不会允许它。


++运算符迭代过去的对象时很有用。例子 :

ptr->name[9] = nullptr; // Make sure the last element is a NULL pointer.

// Take the first element
char **it = ptr->name;

char *current;
// Loop until we reach the NULL
while ((current = *(it++)) != nullptr) {
    printf("%s\n", current);
}

以上是遍历数组的一种(非常丑陋的)方式。

在预先分配的数组中插入东西:

char **it = ptr->name; // Start at the first element

*(it++) = "Hi!";
*(it++) = "This is the second message.";
*(it++) = "Hello world!";
*(it++) = nullptr; // End the array

当然,所有这些迭代的东西都来自一个黑暗的过去:现在我们有 C++ 来为我们处理大部分这些事情,viastd::vector等等。

于 2012-12-27T01:44:19.147 回答