本文主要为结构体。
数组:是一组相同类型元素的集合。
结构:是一些值的集合,这些值称为成员变量,结构的每个成员可以是不同类型的变量。
定义方式:
struct tag { member-list; }variable-list;
例:
typedef struct Stu { char name[20];//名字 int age;//年龄 char sex[5];//性别 char id[20];//学号 }Stu;//分号不能丢,Stu是结构体创建的变量
结构的成员可以是标量、数组、指针,甚至是其他结构体。
结构体变量的定义和初始化:
//声明类型的同时定义变量 struct Point //类型声明 { int x; char y; }p1; //定义结构体变量 struct Point p2; //初始化:定义变量的同时赋初值 struct Point p3 = {x,"y"}; //结构体嵌套初始化 struct Node { int data; struct Point p; struct Node* next; }n1 = {10, {4,5}, NULL}; struct Node n2 = {20, {5, 6}, NULL};
例:
#include <stdio.h> #include <stdlib.h> struct X { char a; int b; }; struct Stu //类型 { //结构的成员变量 struct X x; char name[20];//名字 int age;//年龄 char id[20]; }s1,s2;//结构体创建的全局变量 int main() { struct Stu s = {{'x',2},"Wolverine",18,"123456"}; //局部变量(拿类型创建对象) printf("%c\n",s.x.a); printf("%s\n",s.id); struct Stu* ps = &s; printf("%c\n",(*ps).x.a); printf("%c\n",ps->x.a); return 0; }
.
访问的,点操作符接受两个操作数。例:
#include <stdio.h> #include <stdlib.h> struct X { char a; }; struct Stu { struct X x; char name[20]; }; int main() { struct Stu s = {{'x'},"Wolverine"}; printf("%c\n",s.x.a); printf("%s\n",s.name); return 0; }
例:
#include <stdio.h> #include <stdlib.h> struct X { char a; }; struct Stu { struct X x; char name[20]; }; int main() { struct Stu s = {{'x'},"Wolverine"}; struct Stu* ps = &s; printf("%c\n",(*ps).x.a); printf("%c\n",ps->x.a); return 0; }
代码:
#include <stdio.h> #include <stdlib.h> struct S { int data[10]; int num; }; //结构体传参 void print1(struct S t) { printf("%d\n", t.num); } //结构体地址传参 void print2(struct S* ps) { printf("%d\n", ps->num); } int main() { struct S s = {{1,2,3}, 5}; print1(s); //传值调用 print2(&s); //传址调用 return 0; }
注:结构体传参的时候,要传结构体的地址。
原因:函数传参的时候,参数是需要压栈的。如果传递一个结构体对象的时候,结构体过大,参数压栈的的系统开销比较大,所以会导致性能的下降。
函数调用的参数压栈
栈:是一种数据结构,先进的后出,后进的先出
例:
#include <stdio.h> #include <stdlib.h> int Add(int x, int y) { int z = 0; z = x + y; return 0; } int main() { int a = 1; int b = 2; int c = 0; c = Add(a,b); return 0; }