一.struct 结构体框架 :
struct 类型名
{
};
例:struct Student
{
char name[20];
int age;
};
结构体自定义数据类型,定义完成后等同于内置类型。
1.结构体不能定义一个自身的普通成员,但可以定义一个指向自身的指针。
例:
struct Student
{
char name[20];
int age;
};
struct A
{
struct Student e; //ok
struct B f; //error B未定义
struct A g; //error,因为无法确定g的大小,不能给它分配内存空间
struct A *p; //ok
};
2.结构体普通变量通过"."号访问它的成员,而结构体指针通过"->"号访问它的成员。
struct Student
{
char name[20];
int age;
};
struct Student stu1;//stu1的name和age为随机值
struct Student stu2={"zhang"};//name=zhang,age=0 因为stu2为聚合类型
struct Student stu3={"li",25};
若要将stu3的age变为30 进行操作 stu3.age=30;
若要将stu3的name变为"wang" 进行操作strcpy(stu3.name,"wang");
struct Student *pstu=&stu2;
若要将stu2的age变为35 进行操作pstu->age=35//也可以(*pstu).age=35;一般用"->"
若要将stu2的name变为"sun" 进行操作strcpy(pstu->name,"sun");//也可以strcpy((*pstu).name,"sun");一般用"->"
例:
#include <stdio.h> #include<string.h> struct Student { char name[20]; int age; }; void show(struct Student *s) { printf("name:%s\nage:%d\n\n",s->name,s->age); } int main() { struct Student stu1;//stu1的name和age为随机值 struct Student stu2={"zhang"};//name=zhang,age=0 因为stu2为聚合类型 struct Student stu3={"li",25}; printf("stu1:\n"); show(&stu1); printf("stu2:\n"); show(&stu2); printf("stu3:\n"); show(&stu3); //若要将stu3的age变为30 进行操作 stu3.age=30; //若要将stu3的name变为"wang" 进行操作strcpy(stu3.name,"wang"); stu3.age=30; strcpy(stu3.name,"wang"); printf("修改后的stu3:\n"); show(&stu3); struct Student *pstu=&stu2; //若要将stu2的age变为35 // 进行操作pstu->age=35也可以(*pstu).age=35; //若要将stu2的name变为"sun" //进行操作strcpy(stu2->name,"sun");也可以strcpy((*pstu).name,"sun"); pstu->age=35; strcpy(pstu->name,"sun"); printf("修改后的stu2:\n"); show(&stu2); return 0; }结果:
二.typedef
typedef 数据类型 新数据类型 //它用于类型定义,就相当于给一个类型起一个新名称
typedef unsigned long long int unit64; //给unsigned long long int 起新名称为unit64
unit64 a; //变量a的类型unsigned long long int
区分:
typedef int * Pint;
#define PINT int *
Pint i,j; //i,j的类型都为int *
PINT x,y; //x的类型为int * ,y的类型为int
typedef int Arr[10];
Arr a; //定义一个长度为10的int 数组,数组名为a
例:
typedef int Arr[10]; int main() { Arr a; printf("%d\n",sizeof(a)); return 0; }结果:
typedef int (*pfun)(int ,int);
pfun p; //变量p为一个返回值int,函数形参为两个int的函数指针
例:
int Max(int a,int b) { return a>b?a:b; } typedef int (*pfun)(int,int); int main() { pfun p=Max; printf("%d\n",p(2,6)); return 0; }结果:
用typedef 简略结构体名称
例:struct Student
{
char name[20];
int age;
};
定义结构体变量时要加上struct 比较麻烦
struct Student e;为了简略用typedef 给struct Student起新名称为Student
typedef struct Student Student;
此时定义结构体变量时为 Student e;
例:
struct Student { char name[20]; int age; }; typedef struct Student Student; int main() { Student e={"wang",23}; printf("name:%s\nage:%d\n",e.name,e.age); return 0; }结果:
在C++中通常使用
typedef struct Student
{
char name[20];
int age;
}Student; //Student为给struct Student起的新名称
例:
typedef struct Student { char name[20]; int age; }Student; int main() { Student e={"wang",23}; printf("name:%s\nage:%d\n",e.name,e.age); return 0; }结果: