C语言学习笔记——结构体
结构体的认识
C 结构体,结构是 C 编程中另一种用户自定义的可用的数据类型,它允许您存储不同类型的数据项。
定义结构体
/* s1:结构体标签 v1:结构体变量名*/
struct s1{
double a1; //8Byte
int b1; //4Byte
char c1; //1Byte
}v1;
v1是结构变量,定义在结构的末尾,最后一个分号之前,您可以指定一个或多个结构变量,以便使用。
多种不同的结构体定义方式
只定义标签,暂不定义变量名
struct s2 {
double a2;
int b2;
char c2;
};
只定义变量名,不定义标签
struct {
double a3;
int b3;
char c3;
}v3;
访问结构成员
为了访问结构的成员,我们使用成员访问运算符(.)。成员访问运算符是结构变量名称和我们要访问的结构成员之间的一个句号。
v1.a1 = 1; v1.b1 = 1; v1.c1 = 'A';
printf("%f %d %c\r\n",v1.a1 ,v1.b1 ,v1.c1);
实现最简单的赋值打印输出
通过指向结构的指针,访问结构成员
定义一个最基本的结构体
struct s5 {
double a5;
int b5;
char c5;
}v5;
定义一个指向结构的指针
struct s5 *p = &v5;
通过定义的指针 p 来访问结构成员
p->a5 = 5; p->b5 = 5; p->c5 = 'E';
printf("%f %d %c\r\n", p->a5 , p->b5 , p->c5 );
利用关键字typedef创建结构体
typedef struct s6
{
double a6;
int b6;
char c6;
}v6;
v6 w6 = { 6 , 6 , 'F'};
printf("%f %d %c\r\n",w6.a6 ,w6.b6 ,w6.c6);
输出结果:6.000000 6 F
结构体小例子的实现
基础小示例(数组存储数据)
struct Student
{
char id[20];
char name[20];
char sex[5];
int age;
float score;
struct Student Stu = {"20220815001","xiaov","man",12,90.5};
printf("id: %s\nname: %s\nsex %s\nage: %d\nscore: %f\n",
Stu.id,Stu.name,Stu.sex,Stu.age,Stu.score);
};
Liunx下运行结果:
基础小示例(指针存储数据)
struct Teacher
{
char *name;
char *subject;
int age;
};
struct Teacher Tea = {"Mr.Zhang","chemistry",36};
printf("name: %s\nsubject: %s\nage: %d\n",Tea.name,Tea.subject,Tea.age);
Liunx下运行结果:
进阶小示例(结构体传参①)
typedef struct s7
{
double a7;
int b7;
char c7;
}v7;
void struct_example2(v7 w7)
{
printf("%f %d %c\r\n",w7.a7 ,w7.b7 ,w7.c7);
}
int main()
{
v7 w7 ={7,7,'G'};
struct_example2(w7);
return 0;
}
进阶小示例(结构体传参②)
typedef struct s7
{
double a7;
int b7;
char c7;
}v7;
void struct_example3(v7 *w7)
{
printf("%f %d %c\r\n",w7->a7 ,w7->b7 ,w7->c7);
}
int main()
{
v7 w7 ={7,7,'G'};
struct_example3(&w7);
return 0;
}
一小段代码的实现(分割字符串并储存于结构体中)
typedef struct {
char *param[20];
unsigned int param_num;
} str_v_param;
str_v str_handle(char *string, str_v_param *v)
{
char *tmp =NULL;
char buf[50];
memset(buf,0,sizeof(buf));
tmp = strchr(string, ',');
if((tmp == NULL) || (*(tmp + 1) == '\0') || (*(tmp + 1) == '\n'))
{
return STR_ERROR;
}
tmp = string;
memset(v, 0, sizeof(str_v_param));
v->param[v->param_num] = tmp;
v->param_num += 1;
while(tmp != NULL)
{
tmp = strchr(tmp, ',');
if(tmp == NULL)
break;
*tmp = '\0';
v->param[v->param_num] = tmp + 1;
v->param_num += 1;
tmp += 1;
}
if(v->param_num < 2)
{
return STR_ERROR;
}
return STR_OK;
}
注意(小技巧)
注意结构体变量的大小,必须是结构体变量的“最大基本数据类型成员所占字节数”的整数倍;
图二定义的方式相对于图一,整个结构体的大小会更大,使用占用内存会更多!
/* s1:结构体标签 v1:结构体变量名*/
struct s1{
double a1; //8Byte
int b1; //4Byte
char c1; //1Byte
char d1;
}v1;
struct s2 {int a2;char b2;double c2;char d2;};
struct {int a3;double b3;char c3;char d3;}v3;
v1.a1 = 1; v1.b1 = 1; v1.c1 = 'A'; v1.d1 = 0;
printf("%f %d %c %d\r\n",v1.a1 ,v1.b1 ,v1.c1,v1.d1);
printf("%x %x %x %x\r\n\n",&v1.a1 ,&v1.b1 ,&v1.c1,&v1.d1);
struct s2 v2= { 2 , 'b' , 2 , 0}; v2.b2 = 'B';
printf("%d %c %f %d\r\n",v2.a2 ,v2.b2 ,v2.c2 ,v2.d2);
printf("%x %x %x %x\r\n\n",&v2.a2 ,&v2.b2 ,&v2.c2 ,&v2.d2);
v3.a3 = 3; v3.b3 = 3; v3.c3 = 'C'; v3.d3 = 0;
printf("%d %f %c %d\r\n",v3.a3 ,v3.b3 ,v3.c3,v3.d3);
printf("%x %x %x %x\r\n\n",&v3.a3 ,&v3.b3 ,&v3.c3 ,&v3.d3);
输出结果为:
1.000000 1 A 0
a7b5a020 a7b5a028 a7b5a02c a7b5a02d
2 B 2.000000 0
95ea6370 95ea6374 95ea6378 95ea6380
3 3.000000 C 0
a7b5a030 a7b5a038 a7b5a040 a7b5a041
本文含有隐藏内容,请 开通VIP 后查看