数组允许你定义可以存储相同类型数据项的变量。结构是C编程中另一种用户定义的可用数据类型,它允许您存储不同类型的数据项。
目录
前言1。结构1的声明和定义。结构2的声明。结构构件的类型。结构2的定义。结构3的初始化。接近结构构件4。结构5的嵌套。结构6的指针。结构参考摘要。
前言
c提供了不同的数据类型,如int、float、double、char等。不同的类型决定了变量在内存中应该占据的空间及其表示形式。
但是我们在定义一个人的时候,用相同的数据类型来定义一个人的不同属性是比较困难的,因为人的身高、年龄、体重等属性往往需要不同的数据类型。这时,我们引入结构的概念。
一、结构体的声明与定义
1.结构体的声明
结构是称为成员变量的值的集合。结构的每个成员可以是不同类型的变量。
当我们面对的事物有许多不同的数据类型时,我们可以使用结构来组织它们。
例如,一本书有不同的数据类型,如标题、作者、售价、出版日期等。这时,我们可以创建结构来包含不同数据类型的书籍。
结构声明是描述结构组合的主要方法,语法格式为:
结构名称
{
成员1;
成员2;
成员3;
…
};//分号不能丢
[注意]
结构成员可以是任何基本数据类型,也可以是另一种结构,后者相当于结构的嵌套。(俗称娃娃)
例如:
strut Book//描述一本书的相关属性,其中Book是这个框架的名称。
{
char name[20];//书名
char作者[20];//作者
浮动价格;//价格
};//分号不能丢失。
这相当于描述了一本书的框架。
2.结构成员的类型
结构的类型可以是标量、数组、指针甚至其他结构。
3.结构体的定义
结构的声明只是一个简单的描述。事实上,在定义结构类型变量之前,它不会分配内存空间。
也就是说还没有真正使用过,虚拟存在只存在于定义结构类型变量的时候。
例如,它定义了一本书的框架。
strut Book//描述一本书的相关属性,其中Book是这个框架的名称。
{
char name[20];//书名
char作者[20];//作者
浮动价格;//价格
};//分号不能丢失。
这里,在编译器中,内存空间是不分配的,它只是虚拟存在。一旦我们定义了结构类型变量,就可以给它分配空间。
例如:
strut Book//描述一本书的相关属性,其中Book是这个框架的名称。
{
char name[20];//书名
char作者[20];//作者
浮动价格;//价格
};//分号不能丢失。
int main()
{
结构书书;//局部变量——将它们放入堆栈区域
返回0;
}
我们还可以注意到,在上面的例子中,定义结构变量的语法是:
结构结构名结构变量名
此外,还可以在声明结构时定义结构变量。
strut book//描述一本书的相关属性。
{
char name[20];
char作者[20];
浮动价格;
}b1,B2;//b1,b2是全局变量。把它放在静态区域。
int main()
{
结构书书;//局部变量——将它们放入堆栈区域
返回0;
}
B1和b2结构变量是全局变量,也可以在其他函数中访问。
二、初始化结构体
我们可以在定义变量或数组时初始化它,
例如:
int a=10
int arr[10]={1,2,3,4,5,6,7,8,9,0 };
同样,在定义结构变量时,我们也可以同时对其进行初始化。
strut book//描述一本书的相关属性。
{
char name[20];
char作者[20];
浮动价格;
}b1,B2;//b1,b2是全局变量。把它放在静态区域。
int main()
{
结构书book=
{
《笑傲江湖》”,《金庸》,30
};//在这种情况下,结构变量被初始化,即变量被定义并被赋予初始值。
返回0;
}
三、访问结构体成员
结构变量访问成员结构变量的成员是通过点运算符(.).点运算符接受两个操作数。
例如,book.name引用book结构变量的name成员,它是一个字符数组。
#包含stdio.h
strut book//描述一本书的相关属性。
{
char name[20];
char作者[20];
浮动价格;
}b1,B2;//b1,b2是全局变量。把它放在静态区域。
int main()
{
结构书book=
{
《笑傲江湖》”,《金庸》,30
};//在这种情况下,结构变量被初始化,即变量被定义并被赋予初始值。
printf('%s %s %f\n ',book.name,book.author,book . price);
//使用。访问
返回0;
}
四、结构体嵌套
如果访问嵌套结构成员,则需要使用多级点运算符。因为C语言的结构只能访问最底层的成员,如果有多级结构嵌套,就要逐级深入,直到找到最底层的成员。
结构S
{
int a;
char c;
双d;
};
结构T
{
结构S;//结构嵌套
char name[20];
int num
};
int main()
{
Struct t t t={{100,' C ',3.14},' Reese ',30 };
printf('%d %c %f %s %d\n ',t.s.a,t.s.c,t.s.d,t.name,t . num);//两层点运算符用于查找成员
返回0;
}
五、结构体指针
正如我们在开头所说,结构的成员可以是标量、数组和指针。
这里,我们来认识一下结构指针。
结构书* pt
这里声明了一个指向图书结构类型的指针变量pt。
结构S
{
int a;
char c;
双d;
};
结构T
{
结构S;
char name[20];
int num
};
int main()
{
Struct t t t={{100,' C ',3.14},' Reese ',30 };
printf('%d %c %f %s %d\n ',t.s.a,t.s.c,t.s.d,t.name,t . num);
struct T * pt=t//获取地址的方式
printf('%d %c %f %s %d\n ',(*pt).s.a,(*pt).s.c,(*pt).s.d,(*pt)。姓名,(*pt)。num);
printf('%d %c %f %s %d\n ',pt-s.a,pt-s.c,pt-s.d,pt-name,pt-num);
返回0;
}
[注意]数组名指向第一个元素的地址,所以可以直接将数组名赋给指针变量。但是,结构变量的变量名不是结构的地址,所以需要地址操作符()来获取它的地址。
如上:
struct T * pt=t//获取地址的方式
通过上面的例子,我们还可以发现,通过结构指针访问结构成员有以下两种方式:
(1)(*结构指针)。成员名称
(2)结构指针-成员名
第一,因为点运算符(。)的优先级比指针的值操作符(*)高,应该先用slogan解引用指针,使其成为结构的变量,然后用点操作符访问其成员。
以上两种方法在实现上是完全等价的。但是,请记住,点(。)只能用于结构,而箭头(-)只能用于结构指针。
[相同的打印结果]
当两种方法都可以使用时,首选第二种方法,因为箭头是有方向的,所以可以直接与指针链接。
六、结构体传参
调用函数时,参数的传递就是值的传递过程,也就是将实参传递给形参的过程。所以结构变量可以作为函数的参数传递,两个结构类型相同的结构变量也支持直接赋值。
结构S
{
int arr[100];
int num
char ch
双d;
};
//结构传递参数
无效打印1(结构ss)
{
printf('%d %d %d %c ',ss.arr[0],ss.arr[2],ss.num,ss.ch,ss . d);
}
//结构地址作为参数传递。
无效打印2(结构S*ps)
{
printf('%d %d %d %c ',ps-arr[0],ps-arr[2],ps-num,ps-ch,PS-d);
}
int main()
{
struct S s={ {,2,3,4,5},100,' w ',3.14 };
打印1份;//传输结构
打印2份;//地址传输
返回0;
}
如您所见,参数实际上是被传递的。
那么,以上print1和print2功能哪个更好呢?
答案是:首选print2函数。原因:
当函数传递参数时,参数需要堆叠。传递一个结构对象时,结构过大,参数堆栈开销比较大,会导致性能下降。
因此,当结构作为参数传递时,应该传递该结构的地址。
总结
本文介绍了一些C语言结构的基础知识,结构的内容远不止这些。以后学了更深层次的内容,可能会再写一篇博客深入介绍。另外,本文参考了小乌龟的书《零基础入门学习C语言》,以及网上的一些资料,结合自己在学习和听课过程中的笔记进行梳理。可能会有遗漏,内容来源,或者解释上的遗漏。请包含并原谅我们!
希望能对看到的各位有所帮助!
关于C语言结构的全方位解读这篇文章就到这里。有关C语言结构的更多信息,请搜索我们以前的文章或继续浏览下面的相关文章。希望你以后能支持我们!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。