思维导图:
1.结构体出现的必要:
假如你要定义一个变量来表示体重,你只要这样:int weight=0;就行了。
假如你要存一串字符你只要定义一个字符数组:char C[20];就行了。
但是,当你要定义一个变量来表示一本书的信息呢?这本书的作者名字,价格等都是一些不同类型的变量啊。在这时就需要一个能够表示不通过类型变量的类型出现了。所以结构体就因为这个需要而出现了。
2. 结构体变量的声明,定义,初始化:
2.1声明:
声明:
struct tag{member - list ;} variable - list ;
举个例子:
struct BOOK {
char name[20];
int price;
};
上面的例子便是表明我声明了一个结构体struct BOOK,这个结构体内部有它要表示的内容name还有price.
2.2 定义:
第一种方式:
struct BOOK {
char name[20];
int price;
}s1;
第二种方式:
struct BOOK {
char name[20];
int price;
};
struct BOOK s2;
第三种方式:
struct BOOK {
char name[20];
int price;
};
int main() {
struct BOOK s3;
}
其中,s1和s2是全局变量,s3是局部变量。
假如你要偷懒的话,不想写struct便定义一个结构体变量要怎么做呢?
小牛儿有办法:
typedef struct BOOK {
char name[20];
int price;
}BOOK;//用typedef关键字将struct BOOK重新定义为BOOK
int main() {
BOOK s3;
}
2.3初始化:
第一种:
typedef struct BOOK {
char name[20];
int price;
}BOOK;
int main() {
BOOK s3= { "C语言",25 };//定义并初始化
}
第二种: . +成员名
typedef struct BOOK {
char name[20];
int price;
}BOOK;
int main(){
BOOK s4 = { .name = "C语言",.price = 25 };//用这种方式就可以避免顺序的限制
}
3结构体变量的访问
结构体变量的访问方式有两种。一种是(.),另一种是(->)。
第一种方式是通过变量名+.来访问的,第二种方式是必须通过指针来访问的(也就是结构体内要有指针变量)。
现在通过来演示一下。
#include<stdio.h>
struct book {
char name[20];
int page;
float price;
};
int main() {
struct book s1={"C语言程序设计",200,14.00 };//初始化
printf("《%s》,%d,%f", s1.name, s1.page, s1.price);//通过变量名+.的方式进行访问。
return 0;
}
如果用上指针的话,就可以用指针+->的方式访问了。比如:
#include<stdio.h>
struct book {
char name[20];
int page;
float price;
};
int main() {
struct book s1={"C语言程序设计",200,14.00 };//初始化
printf("《%s》,%d,%f", s1.name, s1.page, s1.price);//通过变量名+.的方式进行访问。
printf("\n");
struct book* p = &s1;//定义一个指针变量
printf("《%s》,%d,%f", p->name, p->page, p->price);//通过指针+->来进行打印。
return 0;
}
3.结构体传参
在学习函数的时候我们知道函数传参有两种形式,一种是数值传参,一种是地址传参。
其实结构体的传参方式也是有这两种的,现在我们就来看一下吧:
3.1数值传参:
#include <stdio.h>
struct key {
int num;//声明一个结构体变量
};
struct key input = { 888888 };//定义一个结构体变量并初始化
int print1(struct key input) {//传一个结构体并打印
printf("%d", input.num);
}
int main() {
print1(input);
return 0;
}
3.2地址传参:
#include <stdio.h>
struct key {
int num;//声明一个结构体变量
};
struct key input = { 888888 };//定义一个结构体变量并初始化
int print2(struct key* p) {//定义一个接收指针并打印函数print2
printf("%d", p->num);
}
int main() {
print1(input);
print2(&input);
return 0;
}
虽说结构体传参也有两种方式,但是我们在传参时一般会选择传地址,因为传地址可以省空间。
比如:你定义了一个有100个空间的数组arr[100],
但是只有10个空间被赋值arr[100]={1,2,3,4,5,6,7,8,9,10}.
在这里如果你使用传数值的方式的话就会有大量空间浪费了。
但是如果使用传址的方式的话就省了很多空间了。
结语:
好了,今天的分享就到这里了。如果有错误的话请各位看官多多指正哦。