扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
生活当中有些对象很难用单个的属性去描述,如一名学生,其有姓名、年龄、性别、学号等诸多属性。对于具有诸多属性的复杂对象,我们就可以用结构体来描述其各种属性,这些属性(值)在结构体当中称作成员变量,成员变量可以是不同的值。
1.2 结构体的声明C语言当中声明结构体的语法如下:
struct tag
{member-list; }variable-list;
其中tag是结构体的名称,menber-list是结构体的成员变量,variable-list是结构体的对象(可以在创建结构体的时候定义对象,也可以不定义)。
例如,定义一个学生结构体:
typedef struct Stu
{char name[20];//名字
int age;//年龄
char sex[5];//性别
char id[20];//学号
}Stu;//分号不能丢
1.3结构成员的类型结构成员变量可以是标量、数组、指针,甚至是其他的结构体。
1.4结构体变量的创建和初始化定义了结构体类型之后,定义结构体变量就很简单了,和简单定义一个整型变量
int a一样:
struct stu{char name[20];//名字
int age;//年龄
char sex[5];//性别
char id[20];//学号
};
struct stu s1; //定义结构体stu的变量s1,不初始化
struct stu s1={"Zhang san",20,"man",123456}; //定义结构体变量并且初始化
在结构体当中也可以定义其他的结构体对象和指向结构体的指针:
struct Node
{int data;
struct stu s1;
struct Node* next;
}n1 = {10, {"Zhang san",20,"man",123456}, NULL}; //结构体嵌套初始化
struct Node n2 = {20,{"Wang wu",18,"man",789456}, NULL};//结构体嵌套初始化
2.结构体成员的访问先定义一个简单的学生结构体并且定义一个它的对象:
struct stu{char name[20];
int age
};
struct stu s1;
在创建结构体的对象s1之后,在内存当中为其分配了相应空间大小:
结构体变量s当中存储有两个值,一个是name,一个是age,单单一个s的话编译器并不知道我们需要访问哪一个值,于是就有了 (.) 操作符,它为我们访问结构体变量当中的属性提供了方法:
struct S s;
strcpy(s.name, "zhangsan");//使用.访问name成员
s.age = 20;//使用.访问age成员
我们也可以通过指向结构体的指针来访问结构体成员的属性:
struct stu
{char name[20];
int age;
};
void print(struct stu *p)
{printf("%s %d\n", (*p).name, (*p).age); //不推荐,体现不了结构体指针的特性
printf("%s %d\n", p->name, p->age);
}
int main()
{struct stu s = {"张三",20 };
print(&s); //将结构体的地址作为参数传给结构体指针
return 0;
}
3.结构体传参对于结构体我们要明白的是,对于一个定义完成的结构体,他就和我们常用的int float 等类型相似,是一个类型。那么我们在将int float等的数据作为参数传给函数进行函数调用的时候,分为传值调用和传址调用,这个特性对于结构体变量来说也是完全适用的。
struct S {int data[1000];
int num;
};
struct S s = {{1,2,3,4}, 1000};
//结构体传参
void print1(struct S s)
{printf("%d\n", s.num);
}
//结构体地址传参
void print2(struct S* ps)
{printf("%d\n", ps->num);
}
int main()
{print1(s); //传结构体
print2(&s); //传地址
return 0;
}
对于上述传值和传值调用,对于结构体来说不考虑其他条件的话,传址是更好的选择。
这是因为:
函数传参的时候,参数是需要压栈的。
如果传递一个结构体对象的时候,结构体过大,参数压栈的系统开销比较大,会导致性能的下降。
因此我们以后用操作结构体的函数时尽量要将结构体的参数设置为指针形参(即将结构体的地址作为参数)。
12月1日更:
要期末考试了,我也只是个大学牲,惧怕挂科,只能暂时放放博客啦,但每天坚持编程是必须的。
到这里初阶阶段的C语言就结束了,下一次更新博客就是进阶的内容啦,给自己提个醒。
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流