首页 > 代码库 > C 结构体小结
C 结构体小结
C 结构体小结
关于结构体的声明:
# include <stdio.h>//第一种方式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 <stdio.h>//第一种方式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 <stdio.h>//第一种方式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 <stdio.h># include <string.h>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‘;}*/
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。