传递结构体变量
结构体变量可以相互赋值么
#include<stdio.h>
int main()
{
struct Test
{
int x;
int y;
}t1,t2;
t1.x=3;
t1.y=4;
t2=t1;
return 0;
}
说明两个结构体之间是可以相互赋值的,
结构体作为参数或者返回值
#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)//只要是结构体 struct就不能少
{
printf("input book name:")
scanf("%s",book.title);
printf("input writer:")
scanf("%s",book.author);
printf("input book.price:");
scanf("%f",&book.price);
printf("input book publish date:");
scanf("%d-%d-%d",&book.date.year,&book.date.month,&book.date.day);
printf("input publisher");
scanf("%s",book.publisher);
return book;
};
int main()
{
struct Book b1,b2;
printf("input first book information:\n ");
b1=getInput(b1);//传入一个空的结构体,返回一个录入之后的结构体
putchar("\n");
//b2同理
return 0;
}
传递指向结构体变量的指针
因为结构体变量可能特别大,直接传值,可能会导致时间或者空间上的开销变得非常巨大。所以传递指针可以节省大量的空间。
#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];
};
void getInput(struct Book *book)//只要是结构体 struct就不能少
{
printf("input book name:")
scanf("%s",book->title);
printf("input writer:")
scanf("%s",book->author);
printf("input book.price:");
scanf("%f",&book->price);
printf("input book publish date:");
scanf("%d-%d-%d",&book->date.year,&book->date.month,&book->date.day);
printf("input publisher");
scanf("%s",book->publisher);
//return book;这里不需要返回值 直接通过指针进行了修改
};
void getInput(struct Book *book)//这里声明要变成指向Book结构体的指针 没有返回值 直接通过指针对结构体内容进行修改
int main()
{
struct Book b1,b2;
printf("input first book information:\n ");
getInput(&b1);//传入结构体的地址,用于指针处理
putchar("\n");
//b2同理
return 0;
}
动态申请结构体
使用malloc函数为结构体分配存储空间,这时候结构体就放在了堆里面。
#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];
};
void getInput(struct Book *book)//只要是结构体 struct就不能少
{
printf("input book name:")
scanf("%s",book->title);
printf("input writer:")
scanf("%s",book->author);
printf("input book.price:");
scanf("%f",&book->price);
printf("input book publish date:");
scanf("%d-%d-%d",&book->date.year,&book->date.month,&book->date.day);
printf("input publisher");
scanf("%s",book->publisher);
//return book;这里不需要返回值 直接通过指针进行了修改
};
void getInput(struct Book *book)//这里声明要变成指向Book结构体的指针
int main()
{
struct Book *b1,*b2;//这里给两个指针
b1=(struct Book *)malloc(sizeof(struct Book));
b2=(struct Book *)malloc(sizeof(struct Book));
if (b1==NULL)||(b2==NULL)
{
printf("mem dis failed!\n");
exit(1);
}
printf("input first book information:\n ");
getInput(b1);//b1此时已经是一个指针
putchar("\n");
free(b1);
//b2同理
return 0;
}