目录
1.普通结构体
2.定义结构体并同时建立变量
3.匿名结构体
4.typedef重命名
5.typedef省略结构体名字
6.结构体数组
7.结构体指针
8.结构体嵌套
9.结构体链表(头插法)
10.结构体中的函数指针
11.结构体的构造函数和初始化列表
1.普通结构体
struct name(结构体名){
结构体成员
};
#include <stdio.h>
struct node
{
int a;
char *b;
};
int main(int argc, char const *argv[])
{
struct node n;
n.b="abcdefg";
n.a=100;
printf("%s\n%d\n",n.b,n.a);
return 0;
}
2.定义结构体并同时建立变量
struct name(结构体名){
结构体成员
}实例变量;
#include <stdio.h>
struct node
{
int a;
char *b;
}n,nn;
int main(int argc, char const *argv[])
{
n.b="abcdefg";
n.a=100;
printf("%s\n%d\n",n.b,n.a);
return 0;
}
3.匿名结构体
struct{
结构体成员
}实例变量;
#include <stdio.h>
struct
{
int a;
char *b;
}n,nn;
int main(int argc, char const *argv[])
{
n.b="abcdefg";
n.a=100;
printf("%s\n%d\n",n.b,n.a);
return 0;
}
4.typedef重命名
typedef struct name1结构体名){
结构体成员
}name2(重新定义的名字);
name2=struct name1
#include <stdio.h>
typedef struct node
{
int a;
char *b;
}node;
int main(int argc, char const *argv[])
{
node n;
n.b="abcdefg";
n.a=100;
printf("%s\n%d\n",n.b,n.a);
return 0;
}
5.typedef省略结构体名字
typedef struct {
结构体成员
}name2(重新定义的名字);
#include <stdio.h>
typedef struct
{
int a;
char *b;
}node;
int main(int argc, char const *argv[])
{
node n;
n.b="abcdefg";
n.a=100;
printf("%s\n%d\n",n.b,n.a);
return 0;
}
6.结构体数组
和创建普通数组一样创建结构体数组即可
#include <stdio.h>
typedef struct node
{
int a;
char *b;
}node;
int main(int argc, char const *argv[])
{
node n[10];
for(int i=0;i<10;i++){
n[i].a=i*i;
n[i].b="zbcdef";
}
for(int i=0;i<10;i++){
printf("%d\t%s\n",n[i].a,n[i].b);
}
return 0;
}
7.结构体指针
extern void *malloc(unsigned int num_bytes);
首先定义一个结构体指针,但此时只是分配了一个地址,结构体成员变量并没有分配空间,因此使用malloc函数动态分配地址, 返回值是一个void*,因此要强转成你要的类型指针。
结构体成员变量赋值:
假如n是一个结构体指针,*n就是这个实际结构体, (*n).成员名 就可以给结构体成员赋值或者更改,此外C语言为了简便,单独规定了结构体指针的定义方式 n->成员名。两种都是可以的;
#include <stdio.h>
typedef struct
{
int a;
char* b;
}node;
int main(int argc, char const *argv[])
{
node *n=(node*)malloc(sizeof(node));
(*n).b="abcdefg";
(*n).a=100;
printf("%s\n%d\n",(*n).b,(*n).a);
return 0;
}
#include <stdio.h>
typedef struct
{
int a;
char* b;
}node;
int main(int argc, char const *argv[])
{
node *n=(node*)malloc(sizeof(node));
n->b="abcdefg";
n->a=100;
printf("%s\n%d\n",n->b,n->a);
return 0;
}
8.结构体嵌套
结构体的成员变量当然可以包含结构体了
#include <stdio.h>
typedef struct student
{
char* name;
int age;
int chengji;
}student;
typedef struct school_class
{
student std[3];
char* t_name;
int t_age;
}school_class;
int main(int argc, char const *argv[])
{
school_class *n=(school_class*)malloc(sizeof(school_class));
n->t_name="曹老师";
n->t_age=21;
n->std[0].name="小明";
n->std[0].age=18;
n->std[0].chengji=500;
n->std[1].name="小张";
n->std[1].age=17;
n->std[1].chengji=600;
n->std[2].name="小红";
n->std[2].age=18;
n->std[2].chengji=700;
printf("老师信息:\n%s\t%d\n",n->t_name,n->t_age);
for(int i=0;i<3;i++){
printf("学生%d信息:\n",i);
printf("%s\t%d\t%d\n",n->std[i].name,n->std[i].age,n->std[i].chengji);
}
return 0;
}
9.结构体链表(头插法)
链表就是结构体的指针指向下一个结构体,其存储不连续,是分布式的,因此读取速度相对数组来说慢的多。定义一个结构体,其结构体成员变量中包括本身的一个结构体指针,因此可以给该结构体变量赋值,赋的值又是一个结构体指针,里面又有一个结构体指针类型的结构体成员,以此类推产生链表。C++的STL库有list库,使用十分方便;
#include"stdlib.h"
#include"stdio.h"
static int wei=1;
typedef struct Node
{
char data[15];
struct Node* next;
}node;
node* head;
void Insert()
{
node* p=(node*)malloc(sizeof(node));
char buff[10];
sprintf(buff,"我是第%d个元素!",wei);
int i=0;
while(buff[i]!='\0'){
p->data[i]=buff[i];
i++;
}
p->data[i]='\0';
p->next=head;
wei++;
head=p;
}
void Print()
{
node* p=head;
while(p!=NULL)
{
printf("%s\n",p->data);
p=p->next;
}
}//自定义打印函数(Print)
int main()
{
head=NULL;
for(int i=0;i<5;i++)
{
Insert();
}
Print();
}
10.结构体中的函数指针
#include <stdio.h>
typedef struct Node{
int x;
int y;
int (*cheng)(int x,int y);
}node;
int cheng_1(int x,int y){
return x*y;
}
int main(){
node m;
m.x=10;
m.y=9;
m.cheng=cheng_1;
printf("%d\n",m.cheng(m.x,m.y));
return 0;
}
11.结构体的初始化列表
#include <iostream>
using namespace std;
struct node{
int age;
string name;
int weight;
int height;
node(string name_1="曹XX",int age_1=18,int weight_1=120,int height_1=180){
name=name_1;
age=age_1;
weight=weight_1;
height=height_1;
}
};
int main(){
node cao("曹仙人",22,123,185);
cout<<cao.name<<' '<<cao.age<<' '<<cao.height<<' '<<cao.weight<<endl;
return 0;
}
12.结构的的构造函数
#include <iostream>
using namespace std;
struct node{
string name;
int age;
int weight;
int height;
node():name("曹仙人"),age(22),weight(120),height(190){
cout<<"构造函数"<<endl;
}
~node(){
cout<<"析构函数"<<endl;
}
};
int main(){
node t;
cout<<t.name<<' '<<t.age<<' '<<t.weight<<' '<<t.height<<endl;
return 0;
}