自定義數據類型/結構體(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));    //所以可以直接調用

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章