传递结构体变量和结构体指针

简介: 传递结构体变量传递指向结构体变量指针动态申请结构体建成图书馆

传递结构体变量和结构体指针

 

目录:

传递结构体变量

传递指向结构体变量指针

动态申请结构体

建成图书馆

 

 

一、传递结构体变量

函数调用时,参数的传递就是一个值传递的过程,即将实参形参赋值给形参。如果结构体变量能够作为函数的参数进行传递,则两两相同,结构体之间可以使用赋值号直接进行赋值。

 

1.关于两个结构体变量是否能够进行赋值的演示

#include <stdio.h>

 

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 <stdio.h>

 

struct Date

{

      int year;

      int month;

      int day;

};

struct Book

{

      char title[128] ;

      char author[40] ;

      float price ;

      struct Date date;    //结构体嵌套

      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.monthbook.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 <stdio.h>

 

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) ;

      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.monthbook->date->day);

      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 <stdio.h>

#include <stdib.h>

 

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.monthbook->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;

 

 

四、构建一个图书馆

用来存放book结构体变量的指针数组,其中的每个元素都是指向一个动态申请的book结构体变量的指针。

image.png

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