一、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;
{
int a;
int *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]是數組而不是指針所以用“.”訪問
}
}
{
Person arr[] = {"caocao",0,"liubei",0,"sunquan",0};
Show(arr,sizeof(arr)/sizeof(arr[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;
{
int *elem;//指向存放數據的動態數組
int length;//有效數據個數
int listsize;//總容量,總格子數
}DSeqList,*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)); //所以可以直接調用