结构 数组

1.结构数组的定义

在C语言中,可以将数组定义为结构类型,他与普通数组的不同之处是结构数组的每一个元素都是一个结构类型的数据。

有以下三种定义方式

(1)先声明结构类型,再定义结构数组,格式如下:

cs 复制代码
struct结构名
{
    成员列表;
};
struct 结构名 数组名[元素个数][,数组名[元素个数],...];

(2)声明结构类型的同时定义结构数组,格式如下:

cs 复制代码
struct 结构名
{
成员列表;
}数组名[元素个数][,数组名[元素个数],...];

(3)直接定义结构数组,格式如下:

cs 复制代码
struct
{
    成员列表;
}数组名[元素个数][,数组名[元素个数],...];

让我们来简单定义一个结构数组

cs 复制代码
struct books
{
    int bno;
    char bname[20];
    char field[10];
    char author_[10];
    char publisher_[30];
    float price;
};
struct books book[5];

结构数组 book 共有5个元素,book[0]~book[4],每个数组元素都具有 struct books的结构类型。

2.结构数组的初始化

结构数组在定义的同时也可以初始化,可进行部分初始化或全部初始化。结构数组初始化的一般形式为

cs 复制代码
struct 结构名 数组名[元素个数] = {初值表列};

(1)在对结构数组进行初始化时,需遵循数组的初始化规律,可对其中的部分数组元素初始化,但是对结构数组元素中的每个成员都要进行初始化。

(2)在对结构数组进行全部初始化时,初值的个数应当与结构数组的元素个数以及每个数组元素的成员个数相匹配。为了增强程序的可读性,最好用大括号将每一个数组元素的初值括起来。

(3)当对结构数组的全部元素进行初始化时,可以省略数组的长度,系统根据初始化数据的多少来确定数组的长度。

3.结构数组的使用

结构数组的使用也是通过引用结构数组元素的成员进行的。结构数组元素中成员的访问方法与结构变量成员的访问方法类似,通过成员运算符"."来引用。另一方面,由于可以通过数组名以指针法形式来引用数组元素,因此对于结构数组元素成员的引用可以有如下几种形式:
(1)结构数组名[下标].成员名

(2)(*(结构数组名十下标)).成员名

(3)(结构数组名十下标)一>成员名

下面来进行实例运用

cs 复制代码
#include<stdio.h>
struct books    /*结构类型*/
{
    int bno;
    char bname[20],field[10],author[10],publisher[30];
    float price;
};
int main( )
{
struct books book[5]={
(101 , "clanguage" ,"computer" ,"xw","rmydpress" ,39},
{102, "vbprogramming" ,"computer" ,"zys" ,"qhdxpress" ,39};
{103 , "java" ,"computer","mj" ,"jxgypress" ,34},
(104 , "linearalgebra" ," math" ,"chc" ,"dzgypress" ,29.8),
{105, "clanguage" ,"computer" ,"thq" ,"qhdxpress" ,26}
};
printf(" %s\t%.2f\n" ,book[2]. bname,book[2].price+10);
printf("%s\t%.2f\n",(*(book+2)).bname,(*(book+2)),price+10);
printf("%s\t%.2f\n",(book+2)->bname,(book+2)->price+10);
return O;
}

在实际应用中,结构数组也可以作为函数的参数,在函数间传递的是结构数组的首地址。即结构数组名作为函数的实参传递给对应的形参,实参和形参指向同一段内存空间,如被调用函数中改变了形参结构数组某个元素的成员值,则相应的实参结构数组元素的值也会发生改变。

我们来尝试一下结构数组作为函数参数的实例

cs 复制代码
#include<stdio. h>
struct ss( int a; int b; };
void fun(struct ss m[ ], int n)
{    int i,j,k;
struct ss temp;
for(i=0;i<n-1;i++)
{
     k=i;
for(j=i+1;j<n;j++)
if((m [j].a<m[k].a)||(m[j].a==m[k].a&.&m[j].b<m[k].b))
    k=j;
if(k!=i)
{    temp=m[i];m[i]=m[k];m[k]= temp;}

int main()
{
struct ss x[]={(5,3},{3,2},{3,6},(2,4},(5,8}};
int i,k=5;
fun(x,k);
for(i=0;i<k;i++)
printf("%d, %d\n",x[i].a, x[i].b);
return0;
}
相关推荐
小林熬夜学编程1 小时前
【Linux网络编程】第十四弹---构建功能丰富的HTTP服务器:从状态码处理到服务函数扩展
linux·运维·服务器·c语言·网络·c++·http
Jackey_Song_Odd1 小时前
C语言 单向链表反转问题
c语言·数据结构·算法·链表
A懿轩A2 小时前
C/C++ 数据结构与算法【数组】 数组详细解析【日常学习,考研必备】带图+详细代码
c语言·数据结构·c++·学习·考研·算法·数组
半盏茶香2 小时前
在21世纪的我用C语言探寻世界本质 ——编译和链接(编译环境和运行环境)
c语言·开发语言·c++·算法
字节高级特工3 小时前
【C++】深入剖析默认成员函数3:拷贝构造函数
c语言·c++
计算机学长大白4 小时前
C中设计不允许继承的类的实现方法是什么?
c语言·开发语言
XH华10 小时前
初识C语言之二维数组(下)
c语言·算法
Uu_05kkq13 小时前
【C语言1】C语言常见概念(总结复习篇)——库函数、ASCII码、转义字符
c语言·数据结构·算法
嵌入式科普15 小时前
十一、从0开始卷出一个新项目之瑞萨RA6M5串口DTC接收不定长
c语言·stm32·cubeide·e2studio·ra6m5·dma接收不定长
A懿轩A15 小时前
C/C++ 数据结构与算法【栈和队列】 栈+队列详细解析【日常学习,考研必备】带图+详细代码
c语言·数据结构·c++·学习·考研·算法·栈和队列