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 ", st.age, st.score, st.sex); printf("%d %f %c ", 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 ", 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 ",man1.age); printf("%d ",man3.score); }
这样一来大家想召唤多少个“男人”都没有问题。另外有一个极端一点的问题,声明结构体名和定义结构体变量名能不能一样?我们可以试试看:
typedef struct man { int age; int score; }man; //还叫man,有意见么? int main() { man man = {40,50};//还叫man,有问题么? printf("%d %d ",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 ", sizeof(st)); InputStudent(&st); //对结构体变量输入 必须发送st的地址 OutputStudent(&st); //对结构体变量输出 可以发送st的地址也可以直接发送st的内容 但为了减少内存的耗费,也为了提高执行速度,推荐发送地址 return 0; } void OutputStudent(struct Student *pst) { printf("%d %c %s ", 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'; } */