C语言中结构体的N种定义及初始化方式,你想要的这里都有(代码例题,超详细)

结构体的n种定义以及初始化方式
  1. 第一种常规定义方式
  • 代码例题
//结构体定义

struct student
    {
        char name[20];
        char sex[10];
        int  age;
        float hight;
        char hoby[100];
    }
//初始化方式一
struct student st_stu = {
	.name= "alex";
	.sex = "man";
	.age = 18;
	.hight = 180.0;
	.hoby = "play、music、eat、play games";
};

	//初始化方式二
	struct student st_stu;
	sprintf(st_stu.name,"%s","alex");
	sprintf(st_stu.sex,"%s","women");
	st_stu.age = 18;
	st_stu.hight = 180.0;
	sprintf(st_stu.hoby,"%s","play、music、eat、play games");
	
	//初始化方式三
	struct student st_stu;
	st_stu.name[0] = "a";
	st_stu.name[1] = "l";
	st_stu.name[2] = "e";
	st_stu.name[3] = "x";
	
	st_stu.sex[0] = "m";
	st_stu.sex[1] = "a";
	st_stu.sex[2] = "n";
	st_stu.age = 18;
	st_stu.hight = 180.0;
	sprintf(st_stu.hoby,"%s","play、music、eat、play games");
	
	//指针初始化方式
	struct student *st_stu = malloc(sizeof(struct student));
	sprintf(st_stu -> name,"%s","alex");
	sprintf(st_stu -> sex,"%s","women");
	st_stu -> age = 18;
	st_stu -> hight = 180.0;
	sprintf(st_stu -> hoby,"%s","play、music、eat、play games");

  • 注意点
    定义的字符串数组,只有在初始化时才能直接赋值(初始化方式一),其他情况只能用数组下标方式(初始化方式三)依个赋值,一般效率的做法是用sprintf直接接收,还可以用strncpy/strcpy复制接收;如果定义了指针,那一定要记得给它分配内存空间,不然会产生野指针。

2.第二种初始化定义方式

  • 代码例题
//结构体定义
 struct student
    {
        char name[20];
        char sex[10];
        int  age;
        float hight;
        char hoby[100];
    }second,*p ;

这里的 second 等同于 struct student second,只不过是定义结构体时把已经确定的结构体变量直接定义了。

//初始化方式一
	//truct student *st_stu;
	sprintf(second.name,"%s","alex");
	sprintf(second.sex,"%s","women");
	second.age = 18;
	second.hight = 180.0;
	sprintf(second.hoby,"%s","play、music、eat、play games");

//初始化方式二
	//truct student *st_stu;
	second.name[0] = "a";
	second.name[1] = "l";
	second.name[2] = "e";
	second.name[3] = "x";
	
	secondu.sex[0] = "m";
	second.sex[1] = "a";
	second.sex[2] = "n";
	second.age = 18;
	second.hight = 180.0;

//指针初始化方式
	//truct student *st_stu;
	p  = malloc(sizeof(struct student));
	sprintf(p  -> name,"%s","alex");
	sprintf(p -> sex,"%s","women");
	p -> age = 18;
	p -> hight = 180.0;
	sprintf(p  -> hoby,"%s","play、music、eat、play games");
  1. 第三种:别名定义方式
  • 代码例题
//结构体定义
  typedef struct student
    {
        char name[20];
        char sex[10];
        int  age;
        float hight;
        char hoby[100];
    }second3;

typedef 作用是给 “struct student” 起个别名,方便使用和牢记,second3 等同于 struct student ,意味着可以直接使用second3 定义一个新的结构体对象。使用如下:

//初始化方式一
	second3 st_stu = {
		.name= "alex";
		.sex = "man";
		.age = 18;
		.hight = 180.0;
		.hoby = "play、music、eat、play games";
	};

//初始化方式二
	second3 st_stu;
	sprintf(st_stu.name,"%s","alex");
	sprintf(st_stu.sex,"%s","women");
	st_stu.age = 18;
	st_stu.hight = 180.0;
	sprintf(st_stu.hoby,"%s","play、music、eat、play games");
	
//初始化方式三
	second3 st_stu;
	st_stu.name[0] = "a";
	st_stu.name[1] = "l";
	st_stu.name[2] = "e";
	st_stu.name[3] = "x";
	
	st_stu.sex[0] = "m";
	st_stu.sex[1] = "a";
	st_stu.sex[2] = "n";
	st_stu.age = 18;
	st_stu.hight = 180.0;
	sprintf(st_stu.hoby,"%s","play、music、eat、play games");
	
//指针初始化方式
	second3  *st_stu = malloc(sizeof(struct student));
	sprintf(st_stu -> name,"%s","alex");
	sprintf(st_stu -> sex,"%s","women");
	st_stu -> age = 18;
	st_stu -> hight = 180.0;
	sprintf(st_stu -> hoby,"%s","play、music、eat、play games");


除了可以定义普通结构变量,还可以定义指针;

//结构体定义
  typedef struct student
    {
        char name[20];
        char sex[10];
        int  age;
        float hight;
        char hoby[100];
    }second3,*p;
//初始化

  	p  st_stu = malloc(sizeof(struct student));
	sprintf(st_stu -> name,"%s","alex");
	sprintf(st_stu -> sex,"%s","women");
	st_stu -> age = 18;
	st_stu -> hight = 180.0;
	sprintf(st_stu -> hoby,"%s","play、music、eat、play games");


其他结构体知识

1.知识点一

	struct 
    {
        char name[20];
        char sex[10];
        int  age;
        float hight;
        char hoby[100];
    }Initialization_one,Initialization_two;
    

这种省略了struct 后面 的结构体参数,表示不能再定义新的结构体内容,只能使用 Initialization_one和Initialization_two这两个内容。(struct new;错误写法)。

2.知识点二

	typedef struct 
    {
        char name[20];
        char sex[10];
        int  age;
        float hight;
        char hoby[100];
    }Initialization;

这种起了别名,缺省了结构参数,表达的意思也是不能再通过struct来定义新的内容,但是它和知识点一的区别是,它可以通过别名来定义 新的内容-----》Initialization student_1;Initialization student_2;Initialization student_n ;好比生活给你关上了一扇窗,又给你打开了一扇窗,相当于没关…。

3.知识点三:结构体的兄弟–>共同体

定义:

	 typedef union u_strusct
	{	int age ;
		double height;
		char bit;
	}u_struct;

它只有一个有效数据,每初始化一个变量都会对前面定义过的变量进行覆盖,我们直接看下面的代码:

int main(int argc, char const *argv[])
{
	u_struct u_test ={

		.age = 90,
		.height = 34.6,
		.bit = 'a'

	};

	/*-----只有一个有效数据,最后赋值那个会把前面的覆盖掉--------*/	
	printf("u_test.age :%d\n", u_test.age );//乱码

	printf("u_test.height :%f\n", u_test.height );//乱码

	printf("u_test.bit :%d\n", u_test.bit );//97,

	printf("u_test.bit :%c\n", u_test.bit );//a

/*---------共同体指针-------------*/
	u_struct *p = &u_test;
	printf("%c\n", p->bit);//a
	printf("%f\n", p->height);//乱码
	printf("%d\n", p->age);//乱码


	return 0;
}

从上面的输出结果,我们可以发现除了bit输出了预期正确结果,其他的输出都是乱码,或者不是我们初始化的值。原因在于bit是最后初始化的,每 初始化一个新变量,前面的都会被覆盖掉。

到此,我们的讲解就结束,希望这些知识点能对你们有所帮助。

©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页