C---结构体:从入门到应用

1.结构体定义的三种方式:

1. 先声明结构体类型,再定义变量名:

#include <stdio.h>

struct student {

	char name[50];
	int age;

};

struct student s1 = { "alien", 18 };


int main() {

	printf("s1.name = %s, s1.age = %d\n", s1.name, s1.age);

}


s1.name = alien, s1.age = 18

2. 在声明类型的同时定义变量名称:

struct student2 {

	char name[50];
	int age;

} s2 = { "alien", 20 }, s3 = { "alien003", 23 };

3.直接定义结构体类型变量(无类型名):

struct {					// 没有设置结构体类型的名称

	char name[50];
	int age;

} s4 = { "alien", 20 };

2.结构体元素的赋值方式:

#include <stdio.h>
#include <string.h>

//结构体类型的定义
struct stu {
	char name[50];
	int age;
};

int main() {
	struct stu s1;
	struct stu* p = &s1;

	
	strcpy(s1.name, "abc");				//结构体变量,通过点运算符操作结构体成员
	s1.age = 18;			
	printf("s1.name = %s, s1.age = %d\n", s1.name, s1.age);


	printf("==========================\n");
	strcpy((&s1)->name, "test_first"); //如果是指针变量,通过->操作结构体成员
	(&s1)->age = 22;
	printf("(&s1)->name = %s, (&s1)->age = %d\n", (&s1)->name, (&s1)->age);


	printf("==========================\n");
	strcpy((*p).name, "test_second");	//指针可以通过点运算符,操作结构体成员
	(*p).age = 25;
	printf("(*p).name = %s, (*p).age=%d\n", (*p).name, (*p).age);
	return 0;
}

s1.name = abc, s1.age = 18
==========================
(&s1)->name = test_first, (&s1)->age = 22
==========================
(*p).name = test_second, (*p).age=25

3.将结构体名作为函数的参数(不推荐)


#include <stdio.h>
#include <string.h>

struct stu {
	char name[50];
	int age;
};


//结构体变量名作为函数的参数
void set_stu(struct stu tmp) {
	strcpy(tmp.name, "alien");
	tmp.age = 18;
	printf("tmp.name = %s, tmp.age = %d\n", tmp.name, tmp.age);
}

int main() {
	struct stu s = { "other", 17};
	set_stu(s);			//将结构体的名称,传递给函数,相当于原始结构体的一个副本传递过去了
	printf("s.name = %s, s.age = %d\n", s.name, s.age);

	return 0;
}


tmp.name = alien, tmp.age = 18		//set_stu函数打印的内容
s.name = other, s.age = 17			//说明,main函数中的s变量的值,没有被set_stu函数修改

  • 结构体变量名传递给函数,相当于只是把值传递给某个函数,个人感觉像是全局传递给了某个函数,但是函数本身没有把最终的参数传递给main函数
  • 所以当函数运行完之后,函数修改之后结果,都随着内存的回收,消失了,相当于没有对main中的结构体s任何操作
  • 最终在main中打印结构体信息的时候,s还是原始的内容

将函数体简单的修改之后:

#include <stdio.h>
#include <string.h>

struct stu {
	char name[50];
	int age;
};


//结构体变量名作为函数的参数
struct stu set_stu(struct stu tmp) {
	strcpy(tmp.name, "alien");
	tmp.age = 18;
	printf("tmp.name = %s, tmp.age = %d\n", tmp.name, tmp.age);

	return tmp;

}

int main() {
	struct stu s = { "other", 17};
	struct stu s_new = set_stu(s);			//将结构体的名称,传递给函数,相当于原始结构体的一个副本传递过去了
	printf("s_new.name = %s, s_new.age = %d\n", s_new.name, s_new.age);

	return 0;
}



tmp.name = alien, tmp.age = 18
s_new.name = alien, s_new.age = 18		// 说明main中的结构体s被修改了

4.将结构体的指针作为函数的参数(推荐)


#include <stdio.h>
#include <string.h>

struct stu {
	char name[50];
	int age;
};


//结构体变量名作为函数的参数
void set_stu(struct stu *tmp) {
	strcpy(tmp->name, "alien");
	tmp->age = 18;
	printf("tmp.name = %s, tmp.age = %d\n", tmp->name, tmp->age);

}

int main() {
	struct stu s = { "other", 17};
	set_stu(&s);			//将结构体的指针,传递给函数
	printf("s_new.name = %s, s_new.age = %d\n", s.name, s.age);

	return 0;
}


tmp.name = alien, tmp.age = 18
s_new.name = alien, s_new.age = 18	// 通过指针,成功的把main函数中的结构体s修改了值

5.在函数中初始化结构体:再把指针传递(不推荐)

#include <stdio.h>
#include <string.h>

struct stu {
	char name[50];
	int age;
};


struct stu * set_stu() {

	struct stu tmp;
	strcpy(tmp.name, "alien");
	tmp.age = 18;
	printf("tmp.name = %s, tmp.age = %d\n", tmp.name, tmp.age);
	return &tmp;			// 将栈上创建的结构体指针,传递出去

}

int main() {
	struct stu s = { "other", 17};
	struct stu * p = set_stu();			//相当于指针p去接收另一个函数在栈上创建的指针
	printf("p->name = %s, p->age = %d\n", p->name, p->age);
	printf("p->name = %s, p->age = %d\n", p->name, p->age);

	return 0;
}


tmp.name = alien, tmp.age = 18
p->name = 烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫, p->age = 18
p->name = 烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫, p->age = 7339044

  • 因为函数set_stu初始化的结构体是临时变量,是在栈上创建的,随着函数的结束,最终这个结构体变量的内存被回收
  • 在main中,指针p接收到的内容就什么都没有了
  • 最终结构体里面,都是随机数了(初始化状态默认给的是随机值)

6.在函数中初始化结构体:再把结构体传递出去(推荐)

#include <stdio.h>
#include <string.h>

struct stu {
	char name[50];
	int age;
};


struct stu set_stu() {

	struct stu tmp;
	strcpy(tmp.name, "alien");
	tmp.age = 18;
	printf("tmp.name = %s, tmp.age = %d\n", tmp.name, tmp.age);
	return tmp;			// 在栈上创建的结构体传递出去

}

int main() {
	struct stu s = { "other", 17};
	struct stu new_tmp = set_stu();			//相当于将结构体,传递给另一个结构体
	printf("new_tmp.name = %s, new_tmp.age = %d\n", new_tmp.name, new_tmp.age);

	return 0;
}



tmp.name = alien, tmp.age = 18
new_tmp.name = alien, new_tmp.age = 18

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章