在main函数里print出来,完整代码如下:
#include<stdio.h>
int main() {
struct book {
char name[30];
char author[20];
}a[2] = { {"Nature","Lina" },{ "Animals","Nick" } };
int i;
for (i = 0; i < 2; i++) {
printf("book name: %s author: %s\n", a[i].name, a[i].author);
};
}
运行后的输出值为:
book name: Nature author: Lina
book name: Animals author: Nick
void demo(){
//定义一个Date的结构体
struct Time{
int hour;
int min;
int sec;
};
struct Date{
int year;
int month;
int day;
struct Time time;
};
//定义一个学生的结构体
struct Student{
char *name;
int age;
float score;
struct Date birthday;
//struct Student stu; //错误的
//struct Student *stu; //这是正确的
};
结构体嵌套自身的指针
struct Person{
char *name;
int age;
//嵌套自己类型的指针
struct Person *child;
};
struct Person kim = {"kim",8,NULL};
struct Person p1 = {"林志颖",35,&kim};
//结构体嵌套自身指针的,访问
printf("%s的儿子是:%s,儿子的年龄:%d\n",p1.name,(*p1.child).name,(*p1.child).age);
printf("%s的儿子是:%s,儿子的年龄:%d\n",p1.name,p1.child->name,p1.child->age);
那 么我写的这个例子明显和百度解释的不符合啊?定义是如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数,确实,有所不同,但道理是一样的,我们接下来再来看一个例子。
#include <stdio.h>
int add_ret() ;
int add(int a , int b , int (*add_value)())
{
return (*add_value)(a,b);
}
int main(void)
{
int sum = add(3,4,add_ret);
printf("sum:%d\n",sum);
return 0 ;
}
int add_ret(int a , int b)
{
return a+b ;
}
从这个例子里,我们看到:
这样子不就符合我们的定义了嘛?我们把函数的指针(地址),这里也就是add_ret,作为参数int add(int a , int b , int (*add_value)()) , 这里的参数就是int(*add_value)() , 这个名字可以随便取,但是要符合C语言的命名规范。当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。我们看到add函数内部,return (*add_value)(a,b) ; 这个(*add_value)(a,b)相当于对指针进行了简引用,我们在main函数中,传入具体要实现功能的函数,add_ret,这个函数很简单,就是实现两数相加并返回,这里刚刚好,简引用,相当于取出指针返回地址里的值,这个值就是return a+b,也就是我们传入a和b两数相加的结果。
那么,回调函数究竟有什么作用呢?