一、struct
1.struct Student //只要定义好了与基本类型一样
{
char name[20];
int age;
};
int main()
{
int a = 10;
struct Student stu1={"caocao"}; //使用 age没有初始化默认为0
}
struct A
{
int a;
float b;
double d;
char c;
short *f;
struct Student e;
struct A *p; //ok 4个字节
struct A g; //error 不能准确分配内存得到字节数
};
2.结构体中有哪些数据类型可以使用?
(1)基本数据类型
(2)上面已经定义好的自定义类型
(3)不能使用自己定义一个自己的普通变量,但是可以定义一个指向自己的指针
3.成员变量命名
(1)对结构体成员的访问(stu1怎么访问age)
①结构体普通变量通过“.”访问它的成员 变量名.成员名 eg: stu1.age
②结构体指针通过“->”访问它的成员,与成员类型无关,“->”自带解引用
如何修改age的值?
struct Student *sp = &stu1; //将变量(stu1)的地址(&stu1)赋给指针,供指针访问结构体的成员
(*sp).age = 20; == sp->age = 20;
{
int a;
int *b;
};
{
struct A sa;
int c;
int *d;
};
如何将"caocao"修改成"liubei"?
stu1.name = "liubei"; //error 字符串不能整体赋值
strcpy(stu1.name,"liubei"); //ok
struct A sa; //c++在使用时才能省略struct,c不能
4.定义结构体数组
xp:写一个统计投票的函数
typedef struct Person
{
char name[20];//候选人姓名
int count; //票数
}Person;
void Ticket(Person *arr,int len)
{
char name[20];
int i;
while(1) //死循环
{
scanf("%s",name);
for(i=0;i<len;i++)
{
if(strcmp(name,arr[i].name) == 0) //strcmp:比较字符串大小的函数
{
arr[i].count++;
break;
}
}
if(i == len)//不在候选人范围
{
return ;
}
}
}
void Show(Person *arr,int len)
{
for(int i=0;i<len;i++)
{
printf("%s,%d\n",arr[i].name,arr[i].count); //arr[i]是数组而不是指针所以用“.”访问
}
}
{
Person arr[] = {"caocao",0,"liubei",0,"sunquan",0};
Show(arr,sizeof(arr)/sizeof(arr[0]));
}
二、typedef
1.typedef:定义新的类型
2.typedef作用
(1)给较长的类型名,起一个较短的别名
typedef unsiged long long uint64;
typedef int * Pint;
typedef int Arr[10];
typedef int (*Pfun)();//函数指针 ()优先级比*高,所以要给*pfun加括号
①没有typedef,则是变量,加上typedef就代表这个类型
(2)给类型起一个跟问题相关的名字
typedef struct A A; //c也可以直接使用A啦
typedef struct A //后面那个A就代表它左边的struct A
{
int a;
char b;
}A;
结构体变量将地址作为参数
如: struct A sa; == A sa;
sa将&sa作为参数
A *sp = &sa; //将变量(stu1)的地址(&stu1)赋给指针,供指针访问结构体的成员
sp->a = 20;
{
int *elem;//指向存放数据的动态数组
int length;//有效数据个数
int listsize;//总容量,总格子数
}DSeqList,*PDSeqList;
例2:typedef int (*PCmp)(void *,void *);
void Sort(void *arr,int count,int elemsize,PCmp fun1)//这时PCmp是一个指向函数的指针,我们可以直接使用它
三、函数指针
1.函数指针:指向函数的指针
int *Max(int,int);
int (*p)(int,int); //Max与p在同一个函数族 指向函数的指针
p = &Max;
printf("%d\n",(*p)(10,20));
2.函数名表示函数的入口地址
p = Avg; //所以不用写成 p = &Avg;
printf("%d\n",p(10,20)); //所以可以直接调用