用于ptr ++算术的char数组[10]的指针

时间:2012-12-27 01:36:59

标签: c

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

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

假设我对变量的赋值是正确的,我认为我更喜欢使用ptr++来表达printf("%s", ptr++)之类的东西。如果我理解正确,ptr++会将指针移动到下一个字符串,或ptr++的一些字符串。这个对吗?对于很多很多事情来说似乎更快。

#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;
}

引导注释:我读过普拉塔的“C Primer Plus”。他在解释事情方面做得很好,当你开始无法应用语法时,就会开始按照自己的意愿行事。在示例中,它从未覆盖使用指向结构的指针来访问多维数组,并且它没有以语法的方式覆盖指针算法,您将实际使用它。任何人都可以推荐另一本可能至少通过这种方法钎焊的书吗?

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

1 个答案:

答案 0 :(得分:1)

嗯,char *name[10]就是这样的:

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

ptr->name[0]方式访问它只会将ptr->name0选为char*

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

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

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


在迭代过去的对象时,++运算符可以有用。示例:

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 ++,它通过std::vector等为我们处理大部分这些事情。