Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用C语言中的另一个变量命名一个变量_C_Variables_Data Structures_Struct - Fatal编程技术网

用C语言中的另一个变量命名一个变量

用C语言中的另一个变量命名一个变量,c,variables,data-structures,struct,C,Variables,Data Structures,Struct,我想创建一个包含两个变量的结构,例如 struct myStruct { char charVar; int intVar; }; 我将结构命名为: struct myStruct name1; struct myStruct name2; 等等 问题是,我不知道要输入多少变量,所以必须有无限的nameX结构 那么,如何用变量命名这些结构呢 谢谢。您应该使用数组和指针 struct myStruct *p = NULL; p = malloc(N * sizeof *p); // wher

我想创建一个包含两个变量的结构,例如

struct myStruct {
char charVar;
int intVar;
};
我将结构命名为:

struct myStruct name1;
struct myStruct name2;
等等

问题是,我不知道要输入多少变量,所以必须有无限的nameX结构

那么,如何用变量命名这些结构呢


谢谢。

您应该使用数组和指针

struct myStruct *p = NULL;
p = malloc(N * sizeof *p);  // where N is the number of entries.
int index = 1; /* or any other number - from 0 to N-1*/
p[index].member = x;
然后,如果需要添加其他条目,可以使用
realloc
向其中添加元素。

将myStruct重新定义为

struct myStruct {
    char charVar;
    int intVar;
    struct myStruct *next;
};
跟踪您拥有的最后一个结构以及列表的开头。添加新元素时,请将它们附加到链接列表的末尾

/* To initialize the list */
struct myStruct *start, *end;
start = malloc(sizeof(struct myStruct));
start->next = NULL;
end = start;

/* To add a new structure at the end */
end->next = malloc(sizeof(struct myStruct));
end = end->next;
end->next = NULL;
此示例不执行任何错误检查。下面是如何逐步打印列表中的所有值:

struct myStruct *ptr;
for(ptr = start; ptr != NULL; ptr = ptr->next)
    printf("%d %s\n", ptr->intVar, ptr->charVar);
对于链表(或者通常的任何其他类型的列表)中的每个结构,您不必有不同的名称。您可以在使用指针时将任何未命名结构指定给指针
ptr

那么,如何用变量命名这些结构呢


我想每个初学者一开始都想说出每件事的名字。这并不奇怪——您学习了如何使用变量存储数据,因此总是使用变量似乎很自然。然而,答案是,您并不总是使用变量来存储数据。通常,您将数据存储在动态创建的结构或对象中。读一下这本书可能会有帮助。其思想是,当您有一段新数据要存储时,您需要一段内存(使用库调用,如
malloc
calloc
)。你通过地址引用那块内存,即指针

struct myStruct *p = NULL;
p = malloc(N * sizeof *p);  // where N is the number of entries.
int index = 1; /* or any other number - from 0 to N-1*/
p[index].member = x;
有很多方法可以跟踪你获得的所有记忆片段,每一种方法都构成了一个完整的系统。例如,您可以在一个连续的内存块(即数组)中保留大量数据。有关示例,请参见Devolus的答案。或者你可以有很多小块的内存,每一块都包含下一块的地址(同样,一个指针);那是一个链表。疯狂物理学家的答案是一个链表的好例子

/* To initialize the list */
struct myStruct *start, *end;
start = malloc(sizeof(struct myStruct));
start->next = NULL;
end = start;

/* To add a new structure at the end */
end->next = malloc(sizeof(struct myStruct));
end = end->next;
end->next = NULL;
每个数据结构都有自己的优缺点——例如,数组允许快速访问,但插入和删除速度较慢,而链表访问速度相对较慢,但插入和删除速度较快。为手头的工作选择正确的数据结构是编程的一个重要部分


使用指针通常需要一点时间,但这是值得的,因为指针为在程序中存储和操作数据提供了很多可能性。享受这段旅程。

查找数组。如果你的机器内存无限,我想要它。lol我的意思是我不知道将输入多少变量,我不想在开始时创建这些变量。我想在用户需要时创建一个结构,但我不知道如何命名。如果条目的数量是无限的,请使用动态内存分配,换句话说,使用链表。将结构更改为包含指向struct myStruct的指针。我收到错误“p的类型冲突”。。。你说的“索引”是什么意思?@Devolus。就个人而言,我同意你的答案,因为这是一个更好的整体概念。我不太喜欢零碎的链表,尽管它们确实有自己的用途。由于内存运行到GBs中,预分配通常更容易。如果需要更多条目,您可以始终
realloc()
。哦,好的,我知道了。。感谢@Devolus的解决方案,感谢重要的编辑Arkadiy(我不能标记两个用户:)。我知道你是如何增加结构数量的。。我只是不明白你是怎么给每个结构命名的。你能帮我理解一下吗?:)@用户3108849。除了列表中的第一个和最后一个结构之外,我没有命名任何结构。从第一个指针开始,沿着
下一个
指针前进,直到碰到
NULL
。这样你就不需要知道名字了。我已经添加了一个示例,说明如何打印列表中的所有值以进行说明。我想我将使用包括命名在内的示例。。非常感谢您的关注:)“我想每个初学者一开始都想为每件事命名。这并不奇怪——您学习了使用变量存储数据,所以您总是使用变量似乎很自然。”是的,这正是我的情况。作为一个有经验的初学者,你能给我一些建议吗?因为我在这里真的很困惑。我被要求建立一种社交网络,程序将从文件中获取命令并应用它们。我想为每个用户创建结构,并将它们命名为user1,user2。。等等,是不是错了?命令会说“让约翰·史密斯和简·多伊成为朋友”,我会寻找约翰和简的结构,让他们成为朋友。我应该使用哪种方法?是的,为每个用户使用一个变量是错误的。在真实的社交网络中,每个用户都可能被表示为数据库表中的一条记录,并且您可能会有另一个表来表示用户之间的关系。但这是相当先进的。我建议学习数组和链表,如其他答案所示。熟悉动态内存分配。然后画一幅你希望你的程序如何表示数据的图片,每个结构都有一个方框,每个指针都有一个箭头。我的程序将是一个社交网络的缩影,我不知道我将添加多少用户,但我想这次给每个用户命名会对我有所帮助。非常感谢您的详细帮助。