C语言学习六

        本文为对C语言结构体的初步学习

一、何为结构体

        结构体是由不同类型的数据构成的一个整体,是C语言提供的一种专门的构造类型

二、结构体定义

struct  结构体名{

        成员变量;

}

例如:构造一个学生类型Stu,它包含姓名,性别,年龄,学号四个属性。

struct Stu{            //Stu为结构体的标签
    char name[20];     //成员类型
    char sex[5];
    int age;
    char no[11];
}stu;                  //相当于创建了一个struct Stu 类型的全局变量stu;可省略

注意:

1、结构体定义时不允许对结构体本身递归定义。例如:

struct Stu{
    char name[20];
    struct Stu s;
};                    //这种定义是错误的

2、结构体内可以包含其他的结构体。例如:

struct Stu{
    char name[20];
    char sex[5];
    int age;
    char no[11];
};
struct class{
    int num;        //人数
    struct Stu s;   //学生信息
};

3、定义结构体类型时,并没有分配空间,就像系统不会给int类型本身分配空间一样。只有当定义属于结构体类型的变量时,系统才会分配存储空间给该变量。

4、结构体变量占用的内存空间是其成员所占内存之和,而且各成员在内存中按定义的顺序依次排列。

三、结构体初始化

        将结构体各成员的初值,按顺序地放在一对大括号{ }中,并用逗号分开。

1、直接赋值初始化:可以在定义结构体变量的同时,直接给其成员赋值。

struct Stu{
    char name[20];
    char sex[5];
    int age;
    char no[11];
}s={"张三","男",25,"100001"};    //定义struct Stu 类型的结构体s并初始化赋值
#include<stdio.h>
struct Stu{
    char name[20];
    char sex[5];
    int age;
    char no[11];
};
 
int main(){
    struct Stu s={"张三","男",25,"100001"}; 
    return 0;
}

2、逐个成员初始化:可以逐个成员地给结构体变量赋值。例如:

struct Stu {
    char name[20];
    int age;
};

struct Stu s;
strcpy(s.name, "张三");
s.age = 25;

3、使用成员名初始化:可以使用成员名来初始化结构体的对应成员。例如:

struct Stu {
    char name[20];
    int age;
};
struct Stu s={.name="张三",.age=25};

4、动态内存分配初始化:可以使用malloc函数动态分配结构体内存,并对其成员进行赋值。例如:

struct Stu {
    char name[20];
    int age;
};

struct Stu *s = malloc(sizeof(struct Stu));
strcpy(s->name, "张三");
s->age = 25;

        一般使用第一种初始化赋值方法。

四、结构体的使用

        较多使用“.”运算符,它的优先级最高。

  举例:

#include<stdio.h>
typedef struct Stu {		//利用typedef标识符将结构体重命名为Stu
	char name[20];
	char sex[5];
	int age;
	char no[11];
}Stu;

void print1(Stu s) {		//将结构体的值传给形参
	printf("姓名:%s\n", s.name);
	printf("性别:%s\n", s.sex);
	printf("年龄:%d\n", s.age);
	printf("学号:%s\n", s.no);
}
void print2(Stu* p) {		//将结构体的地址传给形参
	printf("姓名:%s\n", p->name);
	printf("性别:%s\n", p->sex);
	printf("年龄:%d\n", p->age);
	printf("学号:%s\n", p->no);
}
int main() {
	Stu s = { "张三","男",25,"100001" };	//初始化赋值
	print1(s);								//利用.操作符打印成员的值
	printf("----------------\n");
	print2(&s);								//利用指针->操作符打印成员的值
	return 0;
}

运行结果:

附:以上代码中的两个打印函数,print2较于print1更好;因为函数传参的时候,参数是需要压栈的,如果传递一个结构体对象的时候,结构体过大,参数压栈的系统开销就比较大,就会导致性能降低。

五、结构体数组

1、定义:

struct Stu {
    char name[20];
    int age;
};

struct Stu s[5];    //定义一个包含5个struct Stu类型的数组

2、初始化

struct Stu {
    char name[20];
    int age;
};

struct Stu s[5]={{"张仨",18},{"李四",19}};

3、结构体数组的访问

        用数组下标访问每一个结构体元素,跟普通数组的用法是一样的。

#include<stdio.h>
struct Stu {
	char name[20];
	int age;
};
int main(){
	struct Stu s[5] = { {"张仨",18},{"李四",19} };
	printf("名字:%s", s[0].name);
	printf("	年龄:%d\n", s[0].age);
	printf("名字:%s", s[1].name);
	printf("	年龄:%d\n", s[1].age);
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值