今天给大家简单的介绍一种自定义数据类型——结构体
#include"stdio.h"
#include"string.h"
struct Student
{
char name[20];
int age;
};
//自定义数据类型,定义完成以后,等同于内置类型
void Show(const struct Student *pstu)
{
printf("%s,%d\n",pstu->name,pstu->age);
}
int main()
{
//struct Student stu1;//可以定义结构体变量
//struct Student brr[1];//结构体数组
//struct Student *p;//结构体指针变量
struct Student stu1;//未初始化,取随机值
struct Student stu2={"liubei",25};
struct Student stu3={"caocao"};//聚合类型只初始化一部分,剩余部分为0
struct Student *pstu=&stu2;
//结构体普通变量通过“.”访问它的成员
stu3.age=30;
//stu3.name="sunquan";//error 字符串不能直接赋值
strcpy_s(stu3.name,"sunquan");
//结构体指针变量通过“->”访问它的成员
//*pstu.age=35;//error
//(*pstu).age=35;//"."优先级高于"*",所以需加"()",但error
pstu->age=35;
Show(&stu1);
Show(&stu2);
Show(&stu3);
return 0;
}
结构体不能定义一个包含自身的普通成员
struct A
{
int a;
int *b;
struct A c;
};
举例说明结构体变量的访问方式:
struct A
{
int a;
int *b;
};
struct B
{
int c;
int *d;
struct A e;
};
int main()
{
struct B aa;
struct B *bb=&aa;
aa.c;
aa.d;
aa.e.a;
aa.e.b;
bb->c;
bb->d;
bb->e.a;
bb->e.b;
return 0;
}
由上可见访问结构体变量的成员时,只取决于它前一个是指针变量还是普通变量,若为普通变量则用“.”若为指针变量则用 “->”。(以上不考虑程序的实现只考虑代码的正确性)。
c语言中有两个自带*的符号“->,[]”。一般这个知识点在调用函数是经常会被忽略而出错子函数的形参的改变要想父函数也随之变化,除非有两个:传指针、解引用。
typedef的应用:
举例如下:
//typedef 数据类型名 新数据类型名
typedef struct Student
{
char name [20];
int age;
}Student;
//去掉typedef,查看定义的类型变量,然后加上typedef就由该类型的变量提升为该类型
int main()
{
Student stu1;
Student arr[3]={{"liubei",25},{"caocao",30},{"sunquan",18}};
<span style="color:#4f4f4f">return 0;</span>
<span style="color:#4f4f4f">}</span>
typedef和宏定义的区别:
#include "stdio.h"
typedef unsigned long long int unit64;
typedef int Arr[10];//含10个格子的整型数组类型
typedef int * Pint;
typedef (*pfun)(int,int);
#define PINT int *
int main()
{
Pint i,j;
PINT x,y;
int n;
i=&n;
j=&n;
//宏定义就相当于 int * x,y
x=&n;//x是整型指针 宏定义是字符替换
y=&n;//error y是整型
return 0;
}