1、简单结构体
struct student{
char name[20]; //可以用scanf或者直接赋值
*如果用char *name 在用scanf时没有内存接收
long id;
int age;
float height;
};
结构体中只能声明变量不能赋初值。
struck student zhangsan;
struck student zhangsan = {"xiaowang",2000002,20,180.5};
结构体的访问用".":xiaowang.name
2、typedef
typedef struct student{
char name[20]; //不能用char *name 在用scanf时没有内存接收
long id;
int age;
float height;
}Student; // typedef给一个存在的类型取一个别名
Student zhangsan;
Student zhangsan = {"xiaowang",2000002,20,180.5};
如果不加typedef:
struct student{
char name[20]; //不能用char *name 在用scanf时没有内存接收
long id;
int age;
float height;
}Student;//Student 是一个变量了
3、结构体指针
Student *s;
如果*name是字符串 s->name = "xiaowang";
如果name[]是数组接收 strcpy(s->name,"xiaowang");
s->age = 23;
Student *s[5]; //每一块都存着结构体的地址
Student xw ={"xiaowang",2345,23,164.3};
s[0] =&xw; //结构体指针数组里面的每一个都存着地址,如果不给他内存地址,它的值就为空,不可直接赋值。
s[0]->age = 20;
4、结构体数组
Student array[5] ={};
strcpy(array[0].name,"xiaowang");
array[0].age = 23;
5、用函数指针实现回调(block)功能
#include <stdio.h>
int add(int a, int b, void (*pFunction)(int)){
//。。。。。
pFunction(a+b);
return a + b;
}
void funA(int a){
printf("a+%d\n", a);
}
void funB(int a){
printf("a-%d\n", a);
}
void funC(int a){
printf("a*%d\n", a);
}
int main(int argc, const char * argv[]) {
//一个函数指针只能指向一种类型的函数
void (*pFunction[3])(int);
pFunction[0] = funA;
pFunction[1] = funB;
pFunction[2] = funC;
for (int i = 0; i < 3; i++) {
pFunction[i](3);
}
return 0;
}
原文:http://www.cnblogs.com/zhaopengs/p/5042649.html