我的帖子试图用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。这是我的第二篇文章,我忘了说我真的很喜欢这个网站的文字输入设计。不得不说: - )。
答案 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
等为我们处理大部分这些事情。