开发者学堂课程【你的第一门 C 语言课:传递结构体变量和结构体指针】学习笔记,与课程紧密联系,让用户快速学习知识
课程地址:https://developer.aliyun.com/learning/course/444/detail/5493
传递结构体变量和结构体指针
目录:
传递结构体变量
传递指向结构体变量指针
动态申请结构体
建成图书馆
一、传递结构体变量
函数调用时,参数的传递就是一个值传递的过程,即将实参形参赋值给形参。如果结构体变量能够作为函数的参数进行传递,则两两相同,结构体之间可以使用赋值号直接进行赋值。
1.关于两个结构体变量是否能够进行赋值的演示
#include
int main(void )
{
struct Test
{
int x;
int y;
//定义两个结构体变量
}t1,t2;
t1.x = 3;
//进行赋值
t1.y = 4;
t2 = t1;
printf("t2.x = %d, t2.y = %d\n", t2.x, t2.y);
return0;
}
进行打印
fis hc@bogon s1e44]$ gcc test1.c && ./a.out
t2.x = 3,t2.y = 4
//此时t1打印的值即为事先赋值的值
[fishc@bogon s1e44] s
故:在符合两个结构体变量之间的类型一致这一前提时,此之间可以直接使用赋值号进行赋值。
2.将结构体变量作为参数进行传递
#include
struct Date
{
int year;
int month;
int day;
};
struct Book
{
char title[128] ;
char author[40] ;
float price ;
char publisher[40];
};
struct Book getInput (struct Book
book
)
void printbook(struct Book book)
struct Book getInput (struct Book book
)
//有结构体处必有 struct,此处 book 为形参
{
printf("请输入书名:");
scanf("%s", book.title ) ;
printf("请输入作者: ");
scanf("%s",book.author );
printf("请输入售价:") ;
scanf ("%f",&book.price) ; //加上&以获取地址
printf("请输入出版日期: ");
scanf("%d-%d-%d",&book.date.year, &book.date.month, &book.date.day) ;
printf("请输入出版社: ");
scanf("%s",book. publisher) ;
return book;
//调用 getInput 函数的过程即将形参传递给实参,传递完成后于 getInput 函数对形参进行赋值,录入后返回,再次赋值给 b1结构体。
}
void printbook(struct Book book)
(
prinft(“书名:%s\n”,book.title);
prinft(“作者:%s\n”,book.author);
prinft(“售价:%s\n”,book.price);
scanf(“出版日期:%d-%d-%d\n”,book.date.year,book.date.month,book.date.day);
prinft(“出版社:%s\n”,book.publisher);}
}
int main(void)
struct Book b1,b2;
//空的结构体变量
printf(“请录入第一本书的信息...”)
//将传递过程抽象成函数
b1 = getInput(
b1
);
//进行赋值要求用户录入信息后返回,覆盖空的结构体变量,则之后将会包含用户录入的信息。此处 b1 为实参
putchar(‘\n’)
printf("请录入第二本书的信息...\n");
b2 = getInput(b2)
;
printf("\n\n录入完毕,现在开始打印验证... \n\n");
printf("打印第一本书的信息...n");
printBook(b1);
purchar(‘\n’);
printf("打印第二本书的信息...n");
printBook(b2);
return 0;
}
验证:进行打印
[fishc@bogon s1e44]s gcc test2.c && ./a .out
请录入第一本书的信息...
请输入书名:《带你学C带你飞》
请输入作者:小甲鱼
请输入售价: 48.8
请输入出版日期: 2017-11-11
请输入出版社:清华大学出版社
请录入第二本书的信息.
请输入书名:《零基础入门学习 Python 》请输入作者:小甲鱼
请输入售价: 49.5
请输入出版日期: 2016-11- 11
请输入出版社:清华大学出版社
录入完毕,现在开始打印验证...
打印第一本书的信息...书名:《带你学C带你飞》
作者:小甲鱼
售价:48.80
出版日期: 2017-11-11
出版社:清华大学出版社
打印第二本书的信息...书名:《零基础入门学习Python》作者:小甲鱼
售价: 49.50
出版日期: 2016-11-11
出版社:清华大学出版社
[fishc@bogon s1e44]s vi test2.c
[fishc@bogon s1e44]s
二、传递指向结构体变量指针
最开始,由于结构体变量的尺寸非常大,函数调用的过程中可能会导致空间、时间上的开销巨大,故出于对程序执行效率上的考虑,C 语言不允许将结构体作为参数传递给函数。如今已取消此限制,即可以将结构体与普通类型一样直接传递给函数。但作为开发者,必须有设身处地为程序员的执行效率做出考虑的觉悟
为了避免上述问题,需要运用到传递非结构体本身而是指向它的指针。
1.示例代码的优化
[fishc@bogon s1e44]s vi test2.c test3.c
[fishc@bogon s1e44]s vi test3.c
#include
struct Date
{
intyear;
int month;
int day;
};
struct Book
{
char title[128 ] ;
char author[40] ;
float price ;
struct Date date;
char publisher[40];
};
void getInput(struct Book *book )
void printBookgetInput(struct Book *book )
void getInput (struct Book *book )
//返回值也是一个地址
{
printf("请输入书名:");
scanf("%s", book->title ) ;
//用指针访问成员应用->代替.
printf("请输入作者: ");
scanf("%s", book->author );
printf("请输入售价:") ;
scanf ("%f",&book->price) ;
printf("请输入出版日期: ");
scanf ("%d-%d-%d",&book->date->year, &book->date->month, &book->date->day) ;
scanf("%s",book->publisher) ;
}
void printBook(struct Book *book)
{
prinft(“书名:%s\n”,book->title);
prinft(“作者:%s\n”,book->author);
scanf(“出版日期:%d-%d-%d\n”,book.date.year,book.date.month,
prinft(“出版社:%s\n”,book->publisher);}
}
int main(void )
{
struct Book b1, b2 ;
printf("请录入第一本书的信息...\n");
getInput(&b1);
putchar('\n' );
printf("请录入第二本书的信息...\n");
getInput(&b2) ;
printf("\n\n录入完毕,现在开始打印验证... \n\n");
printf("打印第一本书的信息...");
printBook(&b1);
purchar(‘\n’);
printf("打印第二本书的信息...");
printBook(&b2);
return 0;
2.验证
[fishc@bogon s1e44]s gcc test3.c &&./a .out
三、动态申请结构体
使用 mallow 函数为结构体分配存储空间
1.实例代码改进
[fishc@bogon s1e44]s cp test3.c test4.c
[fishc@bogon s1e44]s vi test4.c
#include
#include
struct Date
{
int year;
int month;
int day;
};
struct Book
{
char title[128] ;
char author[40] ;
float price ;
struct Date date;
char publisher[40];
};
void getInput (struct Book *book )
void printBook(struct Book *book);
void getInput (struct Book *book )
{
printf("请输入书名:");
scanf("%s", book->title ) ;
printf("请输入作者: ");
scanf("%s", book->author );
printf("请输入售价:") ;
scanf ("%f",&book->price) ;
printf("请输入出版日期: ");
scanf ("%d-%d-%d",&book->date->year, &book->date->month, &book->date->day) ;
printf("请输入出版社: ");
scanf("%s",book->publisher) ;
}
void printBook(struct Book *book)
{
prinft(“书名:%s\n”,book->title);
prinft(“作者:%s\n”,book->author);
prinft(“售价:%s\n”,book->price);
scanf(“出版日期:%d-%d-%d\n”,book.date.year,book.date.month,book->date->day);
prinft(“出版社:%s\n”,book->publisher);}
}
int main(void )
{
struct Book *b1, *b2 ;
b1 = (struct Book *)malloc(sizeof(struct Book));
//强制转换为指向 book 结构体的指针
b2 = (struct Book *)malloc(sizeof(struct Book));
if(b1 == NULL || B2 == NULL) //对分配进行检查
{
printf(‘内存分配失败!\n’);
exit(1); //需要一个头文件
}
printf("请录入第一本书的信息...\n");
getInput(b1);
putchar('\n' );
printf("请录入第二本书的信息...\n");
getInput(b2) ;
printf("\n\n录入完毕,现在开始打印验证... \n\n");
printf("打印第一本书的信息...");
printBook(b1);
purchar(‘\n’);
printf("打印第二本书的信息...");
printBook(b2);
free(b1);
free(b2); //进行释放
return 0;
四、构建一个图书馆
用来存放 boo k 结构体变量的指针数组,其中的每个元素都是指向一个动态申请的book 结构体变量的指针。