C语言中的结构数组
我将如何将此代码更改为一个包含25条记录的结构数组? 我熟悉结构,但不确定如何声明和调用结构数组。任何帮助都将不胜感激C语言中的结构数组,c,arrays,structure,C,Arrays,Structure,我将如何将此代码更改为一个包含25条记录的结构数组? 我熟悉结构,但不确定如何声明和调用结构数组。任何帮助都将不胜感激 #include <stdio.h> typedef struct household_t { int ID ; int Income ; int Members ; } houset; void show_house ( houset ) ; int main ( void) { houset hous
#include <stdio.h>
typedef struct household_t
{
int ID ;
int Income ;
int Members ;
} houset;
void show_house ( houset ) ;
int main ( void)
{
houset house = {1990 , 12180 , 5} ;
show_house ( house );
return 0 ;
}
void show_house ( houset passed_house )
{
printf ("\n\nID Income Members") ;
printf ("\n\n%d %d %d \n\n\n",
passed_house.ID ,
passed_house.Income ,
passed_house.Members );
return ;
}
可以将结构数组声明为
houset house[25];
并从主函数调用它作为
show_house ( house[i] );
可以将结构数组声明为
houset house[25];
并从主函数调用它作为
show_house ( house[i] );
它几乎和通常的C类型一样简单:
int main ( void)
{
houset houses[25];
int i;
for (i = 0; i < 25; i++) {
houses[i].ID = 1990;
houses[i].Income = 12180;
houses[i].Members = 5;
show_house (houses[i]);
}
return 0 ;
}
如果您初始化的结构少于25个,其他结构将被零填充。这几乎和通常的C类型一样简单:
int main ( void)
{
houset houses[25];
int i;
for (i = 0; i < 25; i++) {
houses[i].ID = 1990;
houses[i].Income = 12180;
houses[i].Members = 5;
show_house (houses[i]);
}
return 0 ;
}
houset houses[25];
如果初始化少于25个结构,其他结构将用零填充
houset houses[25];
并将其用作函数参数:
void show_houses(houset * houses, int nHouses){
for(int i = 0; i < nHouses; i++){
show_house(houses[i]);
}
}
...
show_houses(houses, 25);
并将其用作函数参数:
void show_houses(houset * houses, int nHouses){
for(int i = 0; i < nHouses; i++){
show_house(houses[i]);
}
}
...
show_houses(houses, 25);
我想你的要求是这样的
household_t house_info[size*];
house_info[1] = {1990 , 12180 , 5};
我想你的要求是这样的
household_t house_info[size*];
house_info[1] = {1990 , 12180 , 5};
请看下面的代码。我希望这个概念简单易懂。 如果你遇到任何困难,发表评论
#include <stdio.h>
typedef struct household_t
{
int ID ;
int Income ;
int Members ;
} houset;
void show_house ( houset[],int ) ;
int main ( void)
{
houset house[2] = {{1990 , 12180 , 5},{1220,12211,3}} ;
show_house ( house, 2); //size of array of struct
return 0 ;
}
void show_house ( houset passed_house[], int size )
{
int i=0;
for (i=0;i<size;i++)
{
printf ("\n\nID Income Members") ;
printf ("\n\n%d %d %d \n\n\n",
passed_house[i].ID ,
passed_house[i].Income ,
passed_house[i].Members );
}
return ;
}
请看下面的代码。我希望这个概念简单易懂。 如果你遇到任何困难,发表评论
#include <stdio.h>
typedef struct household_t
{
int ID ;
int Income ;
int Members ;
} houset;
void show_house ( houset[],int ) ;
int main ( void)
{
houset house[2] = {{1990 , 12180 , 5},{1220,12211,3}} ;
show_house ( house, 2); //size of array of struct
return 0 ;
}
void show_house ( houset passed_house[], int size )
{
int i=0;
for (i=0;i<size;i++)
{
printf ("\n\nID Income Members") ;
printf ("\n\n%d %d %d \n\n\n",
passed_house[i].ID ,
passed_house[i].Income ,
passed_house[i].Members );
}
return ;
}
您要做的是创建一个数组,就像其他数组一样:
houset hose_array[25] = {
{1990 , 12180 , 5},
{1234 , 56789 , 0}
};//initialize here, if you want to
但是您必须更改show_house函数,因为在大多数情况下,当您将数组传递给函数时,数组会衰减为指针。也许可以改成这样:
void show_houses(houset *houses, int len)
{
puts("\n\nID Income Members\n") ;
while(len)
{
printf ("%d %d %d \n",
passed_house->ID ,//indirection operators!
passed_house->Income ,
passed_house->Members );
passed_house++;//move pointer to next house
--len;
}
}
这将打印出len指定的所有房屋
堆栈溢出:
请注意,您可能会发现这样的数组可能会耗尽堆栈内存。在这种情况下,您将发现自己正在使用指向结构的指针数组或指向指针的指针。如果你不熟悉C语言中的动态内存,我建议你先读一下。。。
如果您知道它是如何工作的,或多或少:
houset *house[25];//an array of 25 pointers:
house[0] = malloc(sizeof(houset));
//we're dealing with a pointer, and need the indirection operator here, too
house[0]->ID = 1990;
//the alternative is less readable, IMO:
(*house[0]).Income = 12180;//deref pointer, then direct access is poissible
house[0]->Members = 5;
house[1] = malloc(sizeof(houset));
house[1]->ID = 1991;
house[1]->Income = 22180;
house[1]->Members = 3;
但现在,正如我所说的:数组会退化为指针,所以我们也必须再次更改show_house函数。这就是它变得有点棘手的地方:
void show_houses(houset **houses, int len)
{//pointer to pointer!
puts("ID Income Members\n") ;
while(len)
{//dereference the first pointer
printf ("%d %d %d \n",
(*passed_house)->ID ,//second pointer, still requires indirection
(*passed_house)->Income ,
(*passed_house)->Members );
passed_house++;//shift pointer to pointer by 1
--len;
}
}
完成后,不要忘记释放内存:
free(house[0]);
free(house[1]);
以避免mem泄漏。
同样,可以作为一个工作示例您要做的是创建一个数组,就像其他任何数组一样:
houset hose_array[25] = {
{1990 , 12180 , 5},
{1234 , 56789 , 0}
};//initialize here, if you want to
但是您必须更改show_house函数,因为在大多数情况下,当您将数组传递给函数时,数组会衰减为指针。也许可以改成这样:
void show_houses(houset *houses, int len)
{
puts("\n\nID Income Members\n") ;
while(len)
{
printf ("%d %d %d \n",
passed_house->ID ,//indirection operators!
passed_house->Income ,
passed_house->Members );
passed_house++;//move pointer to next house
--len;
}
}
这将打印出len指定的所有房屋
堆栈溢出:
请注意,您可能会发现这样的数组可能会耗尽堆栈内存。在这种情况下,您将发现自己正在使用指向结构的指针数组或指向指针的指针。如果你不熟悉C语言中的动态内存,我建议你先读一下。。。
如果您知道它是如何工作的,或多或少:
houset *house[25];//an array of 25 pointers:
house[0] = malloc(sizeof(houset));
//we're dealing with a pointer, and need the indirection operator here, too
house[0]->ID = 1990;
//the alternative is less readable, IMO:
(*house[0]).Income = 12180;//deref pointer, then direct access is poissible
house[0]->Members = 5;
house[1] = malloc(sizeof(houset));
house[1]->ID = 1991;
house[1]->Income = 22180;
house[1]->Members = 3;
但现在,正如我所说的:数组会退化为指针,所以我们也必须再次更改show_house函数。这就是它变得有点棘手的地方:
void show_houses(houset **houses, int len)
{//pointer to pointer!
puts("ID Income Members\n") ;
while(len)
{//dereference the first pointer
printf ("%d %d %d \n",
(*passed_house)->ID ,//second pointer, still requires indirection
(*passed_house)->Income ,
(*passed_house)->Members );
passed_house++;//shift pointer to pointer by 1
--len;
}
}
完成后,不要忘记释放内存:
free(house[0]);
free(house[1]);
以避免mem泄漏。
同样,可以作为一个工作示例创建一个结构数组,并根据需要将其中的每一个或全部传递到show_house函数中
e、 g house something[number],然后将其传递给show house函数创建一个结构数组,并根据需要将其中的每一个或全部传递到show_house函数中
e、 g houst something[number],然后将其传递给show house函数就像任何其他数组一样:houst arrOf[10];声明一个由10个house结构组成的数组…但是10应该是25,因为他需要25条记录:到OP:请注意,接受的答案可能会导致臭名昭著的问题,在此问题之后,此站点被命名为:。程序增长越多,就越有可能成为堆栈溢出。一定要通读我的答案,它解释了一种解决方法…谢谢你的信息,非常有用!就像其他阵列一样:House-arrOf[10];声明一个由10个house结构组成的数组…但是10应该是25,因为他需要25条记录:到OP:请注意,接受的答案可能会导致臭名昭著的问题,在此问题之后,此站点被命名为:。程序增长越多,就越有可能成为堆栈溢出。一定要通读我的答案,它解释了一种解决方法…谢谢你的信息,非常有用!如果OP试图创建一个包含25个结构的数组时堆栈耗尽怎么办?他最终会得到一系列指针,这将大大改变show_house的功能…@EliasVanOotegem-这只是Nick完成工作的一种方式。虽然您的代码是有意义的,如果您考虑代码复杂度。但您的代码足够复杂,初学者无法理解。Thanks@vishram0709是的,你的代码帮了我很多,而且很容易理解!然而,埃利亚斯提出了一个很好的观点。@vishram0709:你被投了赞成票,但其他人投了反对票。我不知道你为什么会得到DV,但它与我对可能的堆栈的评论一致
我被投票支持。我的猜测是有人发现没有人提到堆栈耗尽的危险是你回答-1的理由。注:我没有否决投票。我只反对那些完全错误的答案,并且包含不好的、不实用的答案code@vishram0709当前位置我也投了赞成票,但其他人似乎投了你反对票,不知道为什么。你的回答很有帮助,也很容易理解。继续努力,感谢您的回复!如果OP试图创建一个包含25个结构的数组时堆栈耗尽怎么办?他最终会得到一系列指针,这将大大改变show_house的功能…@EliasVanOotegem-这只是Nick完成工作的一种方式。虽然您的代码是有意义的,如果您考虑代码复杂度。但您的代码足够复杂,初学者无法理解。Thanks@vishram0709是的,你的代码帮了我很多,而且很容易理解!然而,埃利亚斯提出了一个很好的观点。@vishram0709:你被投了赞成票,但其他人投了反对票。我不确定你为什么会得到DV,但这与我关于可能出现堆栈溢出的评论一致。我的猜测是有人发现没有人提到堆栈耗尽的危险是你回答-1的理由。注:我没有否决投票。我只反对那些完全错误的答案,并且包含不好的、不实用的答案code@vishram0709当前位置我也投了赞成票,但其他人似乎投了你反对票,不知道为什么。你的回答很有帮助,也很容易理解。继续努力,感谢您的回复!非常有用和信息丰富的感谢,这正是我想要的。非常有用和信息丰富的感谢,这正是我想要的。