博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C 结构体小结
阅读量:6612 次
发布时间:2019-06-24

本文共 3587 字,大约阅读时间需要 11 分钟。

C 结构体小结

关于结构体的声明:

# include 
//第一种方式struct Student{ int age; float score; char sex;};//第二种方式struct Student2{ int age; float score; char sex;} st2;//第三种方式struct { int age; float score; char sex;} st3;int main(void){ struct Student st = {
80, 66.6, 'F'}; return 0;}

 

结构体变量的赋值和初始化:

1.

# include 
//第一种方式struct Student{ int age; float score; char sex;};int main(void){ struct Student st = {
80, 66.6, 'F'}; //初始化 定义的同时赋初值 struct Student st2; st2.age = 10; st2.score = 88; st2.sex = 'F'; printf("%d %f %c\n", st.age, st.score, st.sex); printf("%d %f %c\n", st2.age, st2.score, st2.sex); return 0;}

2.

# include 
//第一种方式struct Student{ int age; float score; char sex;};int main(void){ struct Student st = {
80, 66.6F, 'F'}; //初始化 定义的同时赋初值 struct Student * pst = &st; //&st不能改成st pst->age = 88;//第二种方式 st.score = 66.6f; //第一种方式 66.6在C语言中默认是double类型,如果希望一个实数是float类型,则必须在末尾加f或F, 因此66.6是double, 66.6f或66.6F是float printf("%d %f\n", st.age, pst->score); return 0;}

 


 

引用 : http://www.cnblogs.com/ligongzi/archive/2012/08/24/2654448.html

struct Student{    char name[20];    char sex;    int age;    char addr[40];};/*然后定义一个Student 类型的 student变量*/struct Student student;

也许是我受了Java影响,我一度写成这样:

struct man{    int age = 30;    int score = 80;};int main(){    man man1  = {
20,70};}

  结果是铁定编译通过不了的。因为这是我自创的声明带默认值的结构体,编译器没见过。

结构体成员变量在声明中是不能赋值的。

 

  正确的写法是:

struct Man{    int age; //这样就好了    int score;};int main(){   struct Man man1 = {
30,80};}

 定义结构体的时候每次都要写struct 显然是烦琐了,

精炼的C语言用来typedef来方便定义使用:

typedef struct Man{    int age;    int score;}man;int main(){    man man1 = {
20,80}; man man2 = {
30,70}; man man3 = {
40,99}; printf("%d\n",man1.age); printf("%d\n",man3.score);}

这样一来大家想召唤多少个“男人”都没有问题。另外有一个极端一点的问题,声明结构体名和定义结构体变量名能不能一样?我们可以试试看:

typedef struct man{    int age;    int score;}man;  //还叫man,有意见么?int main(){    man man = {
40,50};//还叫man,有问题么? printf("%d\t%d\n",man.age,man.score);}

编译运行都是没有问题的。不信自己去试试看。

   然后我们来讨论重点吧:

struct Student{    char name[20];    char sex;    int age;    char addr[40];};/*然后定义一个Student 类型的 student变量*/struct Student student;

 

给定义的结构中name和age赋值, 可以用下面语句:

    

strcpy(student->name, "jack");     student->age=21;     student->name就是(*student).name的缩写形式。

 

 

    需要指出的是结构指针是指向结构的一个指针, 是结构中第一个成员的首地址, 因此在使用之前应该对结构指针初始化, 即分配整个结构长度的字节空间, 这可用下面函数完成, 仍以上例来说明如下:

   

student=(struct string*)malloc(size of (struct string));

 

    size of (struct string)自动求取string结构的字节长度, malloc() 函数定义了一个大小为结构长度的内存区域, 然后将其诈地址作为结构指针返回。  

    注意:

    结构变量名不是指向该结构的地址, 这与数组名的含义不同,  因此若需要求结构中第一个成员的首地址应该是&[结构变量名]。

 

 demo.

/*    2009年11月24日9:17:43    示例:        发送地址还是发送内容    目的:        指针的优点之一:            快速的传递数据,            耗用内存小            执行速度快*/# include 
# include
struct Student{ int age; char sex; char name[100];}; //分号不能省void InputStudent(struct Student *);void OutputStudent(struct Student *);int main(void){ struct Student st ; //15行 //printf("%d\n", sizeof(st)); InputStudent(&st); //对结构体变量输入 必须发送st的地址 OutputStudent(&st); //对结构体变量输出 可以发送st的地址也可以直接发送st的内容 但为了减少内存的耗费,也为了提高执行速度,推荐发送地址 return 0;}void OutputStudent(struct Student *pst){ printf("%d %c %s\n", pst->age, pst->sex, pst->name);}void InputStudent(struct Student * pstu) //pstu只占4个字节{ (*pstu).age = 10; strcpy(pstu->name, "张三"); pstu->sex = 'F'; }/*//本函数无法修改主函数15行st的值 所以本函数是错误的void InputStudent(struct Student stu){ stu.age = 10; strcpy(stu.name, "张三"); //不能写成 stu.name = "张三"; stu.sex = 'F';}*/

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的文章
Centos6.7安装Pycharm及升级JDK
查看>>
virtualbox+vagrant学习-3-Vagrant Share-6-Custom Provider
查看>>
软考倒计时18天
查看>>
34.CSS传统布局【上】
查看>>
And Then There Was One
查看>>
JavaScript菜单树
查看>>
创新变革,开拓新源,命运流转
查看>>
MySQL的优化与执行
查看>>
ElasticSearch常用命令
查看>>
转:PHP程序里的敏感信息处理方法
查看>>
只有火狐识别的css
查看>>
团队冲刺第八天
查看>>
hive类型转化错误,会错误提示指定分区参数
查看>>
开源许可证
查看>>
网络之路--【第三章】——分层模型介绍及以太帧结构
查看>>
wxPython treeCtrl树节点递归遍历(复制)
查看>>
[高数][高昆轮][高等数学上][第一章-函数与极限]08.函数的连续性与间断点
查看>>
xss攻击进阶
查看>>
过虑窗体最小化消息
查看>>
(转) Windows下MySQL免安装版的下载与配置
查看>>