厦门建设网站首页,编程常用代码大全,自己怎样优化网站,网站安全备案各位CSDN的uu们你们好呀#xff0c;今天#xff0c;小雅兰的内容是结构体噢#xff0c;之前我们在初始C语言中其实就已经学习过了结构体的知识#xff0c;但是不是很全面#xff0c;这次#xff0c;我们也只是稍微详细一点#xff0c;敬请期待小雅兰之后的博客#xff… 各位CSDN的uu们你们好呀今天小雅兰的内容是结构体噢之前我们在初始C语言中其实就已经学习过了结构体的知识但是不是很全面这次我们也只是稍微详细一点敬请期待小雅兰之后的博客会非常详细地讲解结构体、枚举和联合的知识点。好的现在就让我们进入结构体的世界吧。 结构体类型的声明 结构体初始化 结构体成员访问 结构体传参 结构体的声明
在之前学习的过程中我们其实已经学习过了一些基本类型比如char、short、int、long、float、double但是在生活中只有这些类型是远远不够的如果要描述一本书书的基本信息有书名、作者、出版社、定价、书号......
结构的基本知识
结构是一些值的集合这些值称为成员变量。
结构的每个成员可以是不同类型的变量。
结构的声明
struct tag
{member-list;
}variable-list;例如描述一本书
写法一
struct Book
{char name[20];//书名int price;//价格
}; 写法二
struct Book
{char name[20];int price;//成员变量
}b3,b4,b5;//全局变量
int main()
{struct Book b1;struct Book b2;//局部变量return 0;
}
写法三
我们之前学习过typedef这个关键字typedef是在计算机编程语言中用来为复杂的声明定义简单的别名它与宏定义有些差异。它本身是一种存储类的关键字与auto、extern、mutable、static、register等关键字不能出现在同一个表达式中。
typedef为C语言的关键字作用是为一种数据类型定义一个新名字。这里的数据类型包括内部数据类型int,char等和自定义的数据类型struct等。
在编程中使用typedef目的一般有两个一个是给变量一个易记且意义明确的新名字另一个是简化一些比较复杂的类型声明。
typedef struct Book
{char name[20];int price;
}Book;//不可以加全局变量
//如果实在想使用全局变量可以这样使用
Book b3;
Book b4;//全局变量
int main()
{struct Book b1;struct Book b2;Book b5;Book b6;return 0;
}
例如描述一个学生
typedef struct Stu{char name[20];//名字int age;//年龄char sex[5];//性别char id[20];//学号}Stu//分号不能丢结构成员的类型
结构的成员可以是标量、数组、指针甚至是其他结构体。
struct S
{char c;char arr[10];int *p;
};
struct B
{int a;struct S s;double d;
};
int main()
{return 0;
} 结构体变量的定义和初始化
有了结构体类型那如何定义变量其实很简单。
struct S
{char c;char arr[10];int *p;
}s1,s2;
struct S s3;//全局变量
struct B
{int a;struct S s;double d;
}sb1,sb2;
struct B sb3;
int main()
{struct S s4{c,zhangsan,NULL};int a10;struct B sb4{100,{q,list,a},3.14};return 0;
}下面再来看一个例子
struct Book
{char name[20];int price;
}
int main()
{struct Book b1{鹏哥C语言,66};//也可以不按顺序struct Book b2{.price80,.name杭哥C};printf(%s %d\n,b1.name,b1.price};printf(%s %d\n,b2.name,b2.price};return 0;
}
struct Point{int x;int y;
}p1; //声明类型的同时定义变量p1struct Point p2; //定义结构体变量p2
//初始化定义变量的同时赋初值。
struct Point p3 {x, y};struct Stu //类型声明
{char name[15];//名字int age; //年龄
};struct Stu s {zhangsan, 20};//初始化
struct Node
{int data;struct Point p;struct Node* next;
}n1 {10, {4,5}, NULL}; //结构体嵌套初始化struct Node n2 {20, {5, 6}, NULL};//结构体嵌套初始化 结构体成员的访问
结构体变量.结构体成员
结构体指针——结构体成员
struct Book
{char name[20];int price;
};
void print(struct Book* p)
{printf(%s %d\n, p-name, p-price);
}
int main()
{struct Book b1 {鹏哥C语言,66};struct Book b2 {.price 80,.name 杭哥C};//结构体变量.结构体成员printf(%s %d\n, b1.name, b1.price);printf(%s %d\n, b2.name, b2.price);//结构体指针-结构体成员print(b1);return 0;
}有时候我们得到的不是一个结构体变量而是指向一个结构体的指针。
那该如何访问成员?
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 {zhangsan, 20};print(s);//结构体地址传参return 0;
}结构体传参
struct S
{int arr[100];int n;
};
void print1(struct S ss)
{int i0;for(i0;i10;i){printf(%d ,ss.arr[i]);}printf(\n%d\n,ss.n);
}
int main()
{struct S s{{1,2,3,4,5,6},100};print1(s);//结构体传参return 0;
}
struct S
{int arr[100];int n;
};
void print2(struct S* ps)
{int i 0;for (i 0; i 10; i){printf(%d , ps-arr[i]);}printf(\n%d\n, ps-n);
}
int main()
{struct S s { {1,2,3,4,5,6},100 };print2(s);//传地址return 0;
} 上面的 print1 和 print2 函数哪个好些 答案是首选print2函数。 原因 函数传参的时候参数是需要压栈的。 如果传递一个结构体对象的时候结构体过大参数压栈的的系统开销比较大所以会导致性能的下降。 结论
结构体传参的时候要传结构体的地址。 好啦小雅兰今天的内容就到这里啦内容不多噢但是难度也是有的小雅兰会继续加油呀