【C语言】结构体

结构体初识

结构体的声明

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

结构体的声明

结构体传参

结构体的访问

struct tag
{
 
   member-list
}variable-list;

结构体是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量
例如我们描述一个学生

struct Stu
{
	char name[20];
	int age;
	char sex[5];
	char id[20];
}s1; //注意有分号

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

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

struct Point
{
	int x;
	int y;
}p1;                     //  声明类型的同时定义变量p1
struct Point p2; 		 //  定义结构体变量p2
struct Point p3 = {x,y}; // 初始化 :定义的时候同时赋初值

struct Stu    //类型声明
{
	char name[15]; 
	int age ;
};
struct Stu s = {"hao",19}; //初始化

结构体的访问

  • 结构体变量访问成员,结构体变量的成员是是通过操作符(.)访问的。点操作符接受两个操作数。例如:
    在这里插入图片描述
    我们可以看到s有成员name和age;那么我们如何访问s的成员?
struct S s;
strcpy(s.name,"datou");//使用(.)访问name成员
s.age = 20; //使用(.)访问age成员
  • 结构体指针访问 对变量的访问是通过操作符(->)访问的,有时候我们得到的不是一个结构体变量,而是指向一个结构体的指针。那么结构体指针是怎样访问结构体的呢。如下:
struct Stu
{
	char name[20];
	int age;
};
void print(struct Stu* ps) 
{
	printf("name = %s   age = %d\n", (*ps).name, (*ps).age);
 //使用结构体指针访问指向对象的成员
	printf("name = %s   age = %d\n", ps->name, ps->age);
}
int main()
{
    struct Stu s = {"datou", 20};
    print(&s);//结构体地址传参
    return 0; 
 }

结构体传参

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 ()
{
	struct S s;
	print1(s);  // 传参
	print2(&s); //传地址
}


灵魂拷问: 那么print1和print2函数函数哪一个好?
print2函数传参的时候更好。
函数传参的时候,参数是需要压栈的。当传递一个结构体对象的时候,结构体过大,参数压栈的的系统开销也大,导致性能下降。换一种理解,当如果像print1函数一样,直接传递一个结构体对象,参数是对实参的临时拷贝,形参需要拷贝一个跟实参一样大的空间在栈中,如过实参就是很大的结构体,那么形参开辟的栈就会过大,栈是有空间限制的,如果开辟的栈空间过大会导致栈溢出

总结:结构体传参的时候,要传结构体的地址,指针传参

发布了55 篇原创文章 · 获赞 12 · 访问量 5276

猜你喜欢

转载自blog.csdn.net/weixin_43939593/article/details/103094277