自定义数据类型/结构体(struct)、typedef

一、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;


struct A                      //如何访问b?   sa.b
{
 int a;
 int *b;
};

struct 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]是数组而不是指针所以用“.”访问
 }
}


int main()
{
 Person arr[] = {"caocao",0,"liubei",0,"sunquan",0};
 Ticket(arr,sizeof(arr)/sizeof(arr[0]));
 Show(arr,sizeof(arr)/sizeof(arr[0]));
 return 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;


例1:typedef struct DSeqList   
{
 int *elem;//指向存放数据的动态数组
 int length;//有效数据个数
 int listsize;//总容量,总格子数
}DSeqList,*PDSeqList;

void InitSeqList(PDSeqList ps);//这时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));    //所以可以直接调用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@所谓伊人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值