一、定义
结构体:称为自定义数据类型
定义格式:struct 类型名
结构体:称为自定义数据类型
定义格式:struct 类型名
另外我们要明白:
1、自定义数据类型定义完成以后等同于内置类型
2.结构体不能定义一个自身的普通成员变量,但可以定义一个指向自身的指针变量
1、自定义数据类型定义完成以后等同于内置类型
2.结构体不能定义一个自身的普通成员变量,但可以定义一个指向自身的指针变量
struct Student
{
char name[20];
int age;
};
Struct A
{
int a;
short b;
double c;
struct Student d;//ok
struct B e;//error 由于程序的编译是顺序的,此时struct B还未定义
struct A f;//error
//结构体不能定义一个自身的普通成员变量(无法为其分配内存空间)
struct A *p;//ok
//但可以定义一个指向自身的指针变量(指针所占的内存为4字节)
};
struct B
{
int i;
char j;
struct A k;//ok 因为前面A定义过了
};
二、初始化及成员的访问
1.结构体普通变量通过“.”号来访问其成员
2.结构体指针通过“->”访问其成员
int main()
{
void Show();
struct Student stu1; //它的输出是随机值
struct Student stu2={"liubeu",20};
struct Student stu3={"suquan"}; //由于结构体是聚合类型,则当只初始化一部分时,剩余部分默认值为0.在此处age=0
stu3.age = 30;
strcpy(stu3.name,"zhangfei");//此处用字符串拷贝函数对其进行修改
struct Student *pstu = &stu2;
*pstu.age = 35;//error("."的优先级高于"*",但在这里应该先对pstu进行解引用后在进行"."操作)
(*pstu).age = 35;//ok 等同于 pstu -> age = 35;
strcpy(pstu->name,"zhangfei");
Show(&stu2);
}
void Show(const struct Student *pstu) //结构体的打印函数。
{
printf("%s,%d\n",pstu->name,pstu->age);
}
三、简单化结构体——typedef
1.typedef的使用
typedef unsigned long long int uint64; //无符号长整型8字节64位 可以简写为uint64
typedef int * Pint;//定义一个整型指针的数据类型Pint
typedef int arr[10];//定义一个长度为10的整型数组的数据类型Arr
typedef int(*pfun)(int,int);//函数指针的数据类型
2.typedef重新定义结构体
typedef struct student
{
char a;
int b;
}student;
3.typedef与宏定义的比较
typedef int* Pint;//<类型定义>
# define Pint int*//<字符替换>
Pint i,j;//i,j,都是int *
PINT x,y;//在这里x为int *,y为int类型
对其理解:
首先是去掉typedef,查看定义的变量类型,然后再加上typedef,就由该类型变量变成为这种数据类型