传递结构体变量和结构体指针|学习笔记

简介: 快速学习传递结构体变量和结构体指针

开发者学堂课程【你的第一门 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 结构体变量的指针。

图片17.png

相关文章
|
24天前
|
存储 C语言
C语言如何使用结构体和指针来操作动态分配的内存
在C语言中,通过定义结构体并使用指向该结构体的指针,可以对动态分配的内存进行操作。首先利用 `malloc` 或 `calloc` 分配内存,然后通过指针访问和修改结构体成员,最后用 `free` 释放内存,实现资源的有效管理。
86 13
|
24天前
|
存储 人工智能 算法
数据结构实验之C 语言的函数数组指针结构体知识
本实验旨在复习C语言中的函数、数组、指针、结构体与共用体等核心概念,并通过具体编程任务加深理解。任务包括输出100以内所有素数、逆序排列一维数组、查找二维数组中的鞍点、利用指针输出二维数组元素,以及使用结构体和共用体处理教师与学生信息。每个任务不仅强化了基本语法的应用,还涉及到了算法逻辑的设计与优化。实验结果显示,学生能够有效掌握并运用这些知识完成指定任务。
44 4
|
2月前
|
存储 C语言
C语言指针与指针变量的区别指针
指针是C语言中的重要概念,用于存储内存地址。指针变量是一种特殊的变量,用于存放其他变量的内存地址,通过指针可以间接访问和修改该变量的值。指针与指针变量的主要区别在于:指针是一个泛指的概念,而指针变量是具体的实现形式。
|
2月前
魔法指针 之 指针变量
魔法指针 之 指针变量
16 1
|
2月前
|
C++
析构造函数就是为了释放内存,就是在局部指针消失前释放内存,拷贝构造函数就是以构造函数为模块,在堆里面新开一块,同一个变量在堆里面的地址
本文讨论了C++中构造函数和析构函数的作用,特别是它们在管理动态内存分配和释放中的重要性,以及如何正确地实现拷贝构造函数以避免内存泄漏。
40 2
|
2月前
|
C语言 C++
【C语言】指针篇-一篇搞定不同类型指针变量-必读指南(3/5)
【C语言】指针篇-一篇搞定不同类型指针变量-必读指南(3/5)
|
2月前
|
人工智能
魔法指针 之 指针变量的意义 指针运算
魔法指针 之 指针变量的意义 指针运算
24 0
|
2月前
|
C语言
无头链表二级指针方式实现(C语言描述)
本文介绍了如何在C语言中使用二级指针实现无头链表,并提供了创建节点、插入、删除、查找、销毁链表等操作的函数实现,以及一个示例程序来演示这些操作。
33 0
|
3月前
|
存储 人工智能 C语言
C语言程序设计核心详解 第八章 指针超详细讲解_指针变量_二维数组指针_指向字符串指针
本文详细讲解了C语言中的指针,包括指针变量的定义与引用、指向数组及字符串的指针变量等。首先介绍了指针变量的基本概念和定义格式,随后通过多个示例展示了如何使用指针变量来操作普通变量、数组和字符串。文章还深入探讨了指向函数的指针变量以及指针数组的概念,并解释了空指针的意义和使用场景。通过丰富的代码示例和图形化展示,帮助读者更好地理解和掌握C语言中的指针知识。
117 4
|
4月前
|
C语言
【C初阶——指针5】鹏哥C语言系列文章,基本语法知识全面讲解——指针(5)
【C初阶——指针5】鹏哥C语言系列文章,基本语法知识全面讲解——指针(5)