目录
一、内联函数
1.内联函数
2. # 和 ##
3.可变参数
二、结构体
1.结构体声明
2.定义结构体类型变量
3.访问结构体变量
4.初始化结构体变量
5.初始化结构体的指定成员值
三、结构体数组和结构体指针
1.结构体数组
2.初始化结构体数组
3.结构体指针
四、传递结构体变量和结构体指针
1.传递结构体变量
2.传递指向结构体变量的指针
3.动态申请结构体
代码举例:
#include
inline int square(int x);
inline int square(int x)
{
return x * x;
}
int main(void)
{
int i = 1;
while(i <= 100)
{
printf("%d的平方是%d\n",i-1,square(i++));
}
return 0;
}
运行结果:
代码举例:
#include
#define STR(s) # s
int main(void)
{
printf(STR(Hello %s num = %d),STR(LoveC),520);
return 0;
}
运行结果:
代码举例:
#include
#define TOGETHER(x,y) x ## y
int main(void)
{
printf("%d\n",TOGETHER(2,50));
return 0;
}
运行结果:
#define SHOWLIST(…) printf(#__VA_ARGS__)
代码举例:
#include
#define SHOWLIST(...) printf(# __VA_ARGS__)
int main(void)
{
SHOWLIST(LoveC,520,3.14\n);
return 0;
}
运行结果:
结构体声明是描述结构体组合的主要方法。
struct 结构体名称 结构体变量名
代码举例:
#include
struct Book
{
char title[128];
char author[40];
float price;
unsigned int date;
char publisher[40];
}book;//全局变量
int main(void)
{
// struct Book book;//局部变量
return 0;
}
代码举例:
#include
struct Book
{
char title[128];
char author[40];
float price;
unsigned int date;
char publisher[40];
}book;
int main(void)
{
printf("请输入书名:");
scanf("%s",book.title);
printf("请输入作者:");
scanf("%s",book.author);
printf("请输入售价:");
scanf("%f",&book.price);
printf("请输入出版日期:");
scanf("%d",&book.date);
printf("请输入出版社:");
scanf("%s",book.publisher);
printf("\n=====数据录入完毕=====\n");
printf("\n书名:%s\n",book.title);
printf("作者:%s\n",book.author);
printf("售价:%2f\n",book.price);
printf("出版日期:%d\n",book.date);
printf("出版社:%s\n",book.publisher);
return 0;
}
运行结果:
int a = 520;
int array[5] = {1, 2, 3, 4, 5};
struct Book book = {
"《带你学C带你飞》",
"小甲鱼",
48.8,
20220817,
"清华大学出版社"
};
struct Book book = {.price = 48.8};
struct Book book = {
.publisher = "清华大学出版社",
.price = 48.8,
.date = 20220817
};
struct 结构体名称
{
结构体成员;
}数组名[长度];
struct 结构体名称
{
结构体成员;
};
struct 结构体名称 数组名[长度];
struct Book book[3]={
{"《零基础入门学习Python》","小甲鱼",49.5,{2016,11,11},"清华大学出版社"},
{"《零基础入门学习Scratch》","不二如是",49.9,{2017,10,1},"清华大学出版社“},
{"《带你学C带你飞》","小甲鱼",49.9,{2017,11,11},"清华大学出版社"}
};
struct Book * pt;
pt = &book;
通过结构体指针访问结构体成员有两种方法:
两个结构体变量可以直接赋值
代码举例1:
#include
int main(void)
{
struct Test
{
int x;
int y;
}t1,t2;
t1.x = 3;
t2.y = 4;
t2 = t1;
printf("t2.x = %d,t2.y = %d\n",t2.x,t2.y);
}
运行结果:
代码举例2:
#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];
};
struct Book getInput(struct Book book);
void printBook(struct Book book);
struct Book 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);
return book;
}
void printBook(struct Book book)
{
printf("书名:%s\n",book.title);
printf("作者:%s\n",book.author);
printf("售价:%.2f\n",book.price);
printf("出版日期:%d-%d-%d\n",book.date.year,book.date.month,book.date.day);
printf("出版社:%s\n",book.publisher);
}
int main(void)
{
struct Book b1,b2;
printf("请录入第一本书的信息 ……\n");
b1 = getInput(b1);
putchar('\n');
printf("请录入第二本书的信息 ……\n");
b2 = getInput(b2);
printf("\n\n录入完毕,现在开始打印验证……\n\n");
printf("打印第一本书的信息……\n");
printBook(b1);
putchar('\n');
printf("打印第二本书的信息……\n");
printBook(b2);
return 0;
}
运行结果:
上述代码改为:
#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);
return book;
}
void printBook(struct Book *book)
{
printf("书名:%s\n",book->title);
printf("作者:%s\n",book->author);
printf("售价:%.2f\n",book->price);
printf("出版日期:%d-%d-%d\n",book->date.year,book->date.month,book->date.day);
printf("出版社:%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("打印第一本书的信息……\n");
printBook(&b1);
putchar('\n');
printf("打印第二本书的信息……\n");
printBook(&b2);
return 0;
}
使用malloc函数为结构体分配存储空间
上述代码改为:
#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);
return book;
}
void printBook(struct Book *book)
{
printf("书名:%s\n",book->title);
printf("作者:%s\n",book->author);
printf("售价:%.2f\n",book->price);
printf("出版日期:%d-%d-%d\n",book->date.year,book->date.month,book->date.day);
printf("出版社:%s\n",book->publisher);
}
int main(void)
{
struct Book *b1,*b2;
b1 = (struct Book *)malloc(sizeof(struct 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("打印第一本书的信息……\n");
printBook(b1);
putchar('\n');
printf("打印第二本书的信息……\n");
printBook(b2);
free(b1);
free(b2);
return 0;
}