C语言学习笔记(七)初识结构体

arongsec / 2023-08-04 / 原文

初识结构体

结构体的声明

结构体的基础知识

结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。

结构的声明

struct 标签
{
	值;
	值;
	……
}变量列表;

例:

//定义一个结构体类型

struct Stu//struct - 结构体关键字 Stu - 结构体标签  struct Stu - 结构体类型
{
	char name[20];
    short age;
    char tel[12];
    char sex[5];
};//注意此处的分号必不可少

int main()
{
    struct Stu s;//创建一个结构体变量
    return 0;
}

当创建了结构体变量时,才分配了内存空间

例2

struct Stu
{
	char name[20];
    short age;
    char tel[12];
    char sex[5];
}s1,s2,s3;//s1,s2,s3是三个全局的结构体变量;

int main()
{
    struct Stu s;//s是局部的结构体变量;
    return 0;
}

例3

typedef struct Stu
{
	char name[20];
    short age;
    char tel[12];
    char sex[5];
}Stu;//代表:类型是Stu—>区别于上一个代码,在此处不再是创建全局变量

int main()
{
    Stu s2;//此时只是用Stu也可以创建结构体变量s2
    return 0;
}

结构体成员的类型

结构体成员的类型可以是标量、数组、指针、甚至是其他结构体

结构体变量的定义和初始化

定义结构体变量

方法一:在声明结构体变量的同时定义变量p1

struct Point
{
	int x;
	int y;
}p1;

方法二:直接定义结构体变量p2

struct Point p2;

结构体变量的初始化

例1

初始化结构体同用大括号 { }

typedef struct Stu
{
	char name[20];
    short age;
    char tel[12];
    char sex[5];
}Stu;
int main()
{
    Stu s1 = {"张三",20,13598746325,"男"};//初始化
    struct Stu s2 = {"旺仔",18,"13046956257","女"};//初始化
    return 0;
}

例2

嵌套结构体初始化

struct S
{
	int a;
	char c;
	char arr[20];
	double d;
};

struct T
{
	char ch[10];
	struct S s1;
	char* pa;
};

int main()
{
	char arr[] = "okokgogogo!"
	struct T t1 = {"haha",{6,"a","wowowowow",3.14},arr}//初始化
	return 0;
}

结构体变量的打印

#include <stdio.h>
struct S
{
	int a;
	char c;
	char arr[20];
	double d;
};

struct T
{
	char ch[10];
	struct S s1;
	char *pa;
};

int main()
{
	char arr[] = "okokgogogo!";
	struct T t1 = {"haha",{6,"a","wowowowow",3.14},arr};
	printf("%s\n",t1.ch);//打印haha
	printf("%s\n",t1.s1.arr);//打印wowowowow
	printf("%lf\n",t1.s1.d);//打印3.14
	printf("%s\n",t1.pa);//打印okokgogogo!
	return 0;
}

结构体成员的访问

  • 通过点操作符(.)来进行访问

  • 点操作符接受两个操作数

结构体传参

例1

typedef struct Stu
{
	char name[20];
    short age;
    char tel[12];
    char sex[5];
}Stu;

void Print1(Stu tmp)
{
    printf("name:%s\n",tmp.name);
    printf("age:%d\n",tmp.age);
    printf("tel:%s\n",tmp.tel);
    printf("sex:%s\n",tmp.sex);
}

int main()
{	
    Stu s = {"小李",18,"13549626666","男"};
    Print1(s);
    return 0;
}

例2:用指针传参

typedef struct Stu
{
	char name[20];
    short age;
    char tel[12];
    char sex[5];
}Stu;

void Print2(Stu* pa)//接收的变量类型是指针
{
    printf("name:%s\n",pa->name);
    printf("age:%d\n",pa->age);
    printf("tel:%s\n",pa->tel);
    printf("sex:%s\n",pa->sex);
}

int main()
{	
    Stu s = {"小李",18,"13549626666","男"};
    Print2(&s);//传递的是指针
    return 0;
}

优先选择地址传参!

如果传递一个结构体对象时,结构体过大,系统开销大,所以传地址更好