结构体无法比较 由于结构体的成员不一定是连续地存储在内存中,所以不能用运算符==或!=来对结构体进行比较,事实上,在一个结构体的存储区域内可能会出现一些“空洞”,这是由于计算机是按照一定的边界,例如半字、字、双字边界来存储不同数据类型的变量。
对结构体的访问
结构体成员运算符structure member operator(.),也被称为圆点运算符
结构体指针运算符structure pointer operator(->),也被称为箭头运算符
指针方式的结构体 在传递一个结构体时,用传地址的方式比采用传值的方式效率高,因为传值会要求复制整个结构体。
多重结构体变量访问 这里由引出来另一个比较有意思的问题,既然结构体的变量可以不同类型的,当然结构体也可以作为内部变量,如下所示,shao_struct_v2.c
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 #include <stdio.h> #include <string.h> struct Date { int year; int month; int day; }; struct Student { char id[5 ]; char name[10 ]; int age; char sex[10 ]; struct Date date ; }; int main (int argc, char const *argv[]) { struct Student s1 = {"0001" , "Little Bob" , 20 , "male" }; strcpy (s1.name, "Big Bob" ); s1.date.year = 1990 ; s1.date.month = 1 ; s1.date.day = 12 ; printf ("ID \t Name \t AGE \t\t SEX \t\n" ); printf ("%s\t%s\t%d(%d-%d-%d)\t%s\n" ,s1.id, s1.name, s1.age, s1.date.year, s1.date.month, s1.date.day, s1.sex); return 0 ; }
输出为 1 2 3 4 5 6 ➜ struct git:(master) ✗ gcc shao_struct_in_struct.c ➜ struct git:(master) ✗ ls a.out shao_struct_in_struct.c shao_struct_simple.c ➜ struct git:(master) ✗ ./a.out ID Name AGE SEX 0001 Big Bob 20(1990-1-12) male
根据“用户输入”初始化结构体 用户输入信息需要访问到结构体变量所在的内存空间地址
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 #include <stdio.h> #include <string.h> #include <stdlib.h> struct Student { char id[5 ]; char name[10 ]; int age; char sex[3 ]; }; int main () { struct Student s1 ; printf ("input id:>" ); scanf ("%s" ,s1.id); printf ("input age:>" ); scanf ("%d" ,&s1.age); } ``` ## 定义结构体类型数组,通过数组同时初始化多个结构体 ```c #include <stdio.h> #include <string.h> #include <stdlib.h> struct Student { char id[5 ]; char name[10 ]; int age; char sex[3 ]; }; void main () { struct Student S [2]= {{"0001" ,"Newton" ,35 ,"男" }, {"0002" ,"Lagrange" ,30 ,"男" }}; for (int i=0 ;i<2 ;++i) { printf ("id=%s,name=%s,age=%d,sex=%s\n" , S[i].id,S[i].name,S[i].age,S[i].sex); } }
定义结构体指针,通过指针指向符->访问结构体成员变量 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 #include <stdio.h> #include <string.h> #include <stdlib.h> struct Student { char id[5 ]; char name[10 ]; int age; char sex[3 ]; }; void main () { int a =10 ; int *pa=&a; Student s1={"0001" ,"Euler" ,32 ,"男" }; printf ("id=%s,name=%s,age=%d,sex=%s\n" ,s1.id,s1.name,s1.age,s1.sex); struct Student *ps = &s1; printf ("id=%s,name=%s,age=%d,sex=%s\n" ,ps->id,ps->name,ps->age,ps->sex); }
线性链表 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 #include <stdio.h> #include <string.h> #include <stdlib.h> #include <malloc.h> #define ElemType int struct Node { ElemType data; struct Node *next ; }; typedef Node* List;void InitList (List *head) { *head=NULL ; } void CreateList (List *head) { *head=(Node *)malloc (sizeof (Node)); (*head)->data=1 ; (*head)->next=NULL ; Node *p=*head; for (int i=2 ;i<=10 ;++i) { Node *s=(Node *)malloc (sizeof (Node)); s->data=i; s->next=NULL ; p->next=s; p=s; } } void ShowList (List head) { Node *p=head; while (p!=NULL ) { printf ("%d-->" ,p->data); p=p->next; } printf ("Over!\n" ); } void main () { List mylist; InitList(&mylist); CreateList(&mylist); ShowList(mylist); }