#include <stdio.h>
#include<stdlib.h>
#include<string.h>
#include<Windows.h>
//結構體是一種構造數據類型
//把不同的數據類型結合起來成爲 : 一個自定義的數據類型
/*
struct Man{
//成員
char name[20]; //a
//char* name; //b
int age;
//int(*func)();
};
void main(){
//初始化結構體類型的變量
//方式一:
// struct Man person = { "charles", 27 };
//方式二:
struct Man person;
person.age = 27;
//person.name = "charles"; //b 指針字符串纔可以 成員 char* name;
//strcpy(person.name, "charles"); //a
sprintf(person.name,"jack");
printf("%s,%d\n",person.name,person.age);
getchar();
}
*/
//結構體的幾種寫法
/*
struct Men{
char name[20];
int age;
} m1, m2 = {"Rose",18};//m1 結構體變量名
void main(){
strcpy(m1.name,"jack");
m1.age = 20;
printf("%s,%d\n",m1.name,m1.age);
printf("%s,%d\n", m2.name, m2.age);
getchar();
}
*/
//匿名結構體
//主要用於控制結構體變量的個數(限量版只能通過m1來使用該結構體)
/*
struct {
char name[20];
int age;
} m1;
*/
//結構體嵌套
/*
struct Teacher{
char name[20];
};
struct Student{
char name[20];
int age;
struct Teacher t;
};
void main(){
struct Student s1 = { "Jason", 23, { "Vivi" } };
struct Student s2;
s2.age = 10;
strcpy(s2.name, "Jason");
strcpy(s2.t.name,"Vivi"); //鏈式命名
system("pause");
}
*/
/*
struct Student{
char name[20];
int age;
struct Teacher{ //內部匿名結構體
char name[20];
} t;
};
void main(){
struct Student s1;
strcpy(s1.t.name,"Tom");
}
*/
/*
//結構體與指針
struct Man{
char name[20];
int age;
};
void main(){
struct Man m1 = {"Jack",30};
//結構體指針
struct Man *p = &m1;
printf("%s,%d\n",m1.name,m1.age);
printf("%s,%d\n", (*p).name, (*p).age);
// -> (箭頭符號)是(*p).的簡寫形式 表示指針對應的結構體對象的成員
printf("%s,%d\n", p->name, p->age);
}
*/
/*
//結構體數組與指針
struct Man{
char name[20];
int age;
};
void main(){
struct Man mans[] = { { "Jack", 20 }, {"Rose",22} };
//結構體指針
struct Man *p = mans;
//指針遍歷
for (; p < mans + sizeof(mans)/sizeof(struct Man);p++){
printf("%s,%d\n", p->name, p->age);
}
//下標遍歷
int i = 0;
for (; i < sizeof(mans) / sizeof(struct Man);i++){
printf("%s,%d\n", mans[i].name, mans[i].age);
}
getchar();
}*/
//結構體的大小 (字節對齊)
/*
struct Man{
int age; //4字節 -->對象中佔8個字節 和最大的那個屬性類型的字節長度對齊
double weight; //8字節
};
void main(){
//結構體變量的大小,必須是最寬基本數據類型的整數倍 eg:本例中必須是double的整數倍 12--》16
//浪費空間 換取讀取的時間 提高了讀取效率---》 固定長度
struct Man mm = { 22, 68.5 };
printf("%#x,%d\n",&mm,sizeof(mm)); //0xd3f790,16
getchar();
}
*/
/*
struct Man{
char *name;
int age;
};
//結構體動態內存分配
void main(){
struct Man *m_p = (struct Man*) malloc(sizeof(struct Man)*5); //動態內存分配5個sturct Man類型的大小
struct Man *p = m_p;
//賦值
p->age = 22;
p->name = "Jack";
p++;
p->age = 25;
p->name = "Rose";
struct Man *loop_p = m_p;
for (; loop_p < m_p + 2;loop_p++){
printf("%d,%s\n", loop_p->age,loop_p->name);
}
free(m_p); //釋放內存
getchar();
}
*/
typedef: 簡單的說,就是按照定義變量的方式,把變量名換成新類型名,
並且在最前面加上"typedef",就聲明瞭行類型名代表原來的類型.
eg:
以定義數組類型爲例來說明:
1.先按照定義數組變量形式書寫: int a[20];
2.將變量名稱改爲自己命名的類型名 int Num[20];
3.在前面加上"typedef"得到 typedef int Num[20];
4.用自定義類型名來定義變量 Num a -->相當於定義了 int a[20];
eg:
void showMsg(char*msg, char*title){
MessageBox(0,msg,title,0);
}
typedef void(*Jfun)(char*m, char*n); //函數指針用別名取代 使用起來簡單易懂 類似java類
void main(){
//double f = 2.5;
//double *int_poniter = &f;
//printf("%lf",*int_poniter);
//原生
//void(*fun_p)(char*m, char*n) = showMsg;
//fun_p("how are you !","say Hi");
//用別名
Jfun fun = showMsg;
fun("how are you !", "say Hi");
getchar();
}
//小知識點:
字符數組賦值只能在聲明時, //字符指針可以更改賦值,但是不能更改某個元素
char a[20]; a="hello"; //無法日通過編譯
char a[20] = "hello";//聲明時賦值
a="Morning"//這是無法通過編譯的
a[0] = ’H‘;//可以更改某個元素
//想要重新賦值 只能通過一些字符串函數實現:strcpy(a, "Morning");
//typedef 類型取別名
//1.不同的名稱代表在做不同的事 typedef int jint
//2.不同的情況下使用不同的別名 typedef _JNIEnv JNIEnv;t ypedef _JavaVM JavaVM;
//3.書寫簡潔
//常見類型取別名
typedef int* Ap;
typedef int Age;
//-----------------
struct Man{
char *name;
int age;
};
//結構體取別名 的兩種方式
//方式一:根據需要想取別名時纔去定義
typedef struct Man JavaMan;
typedef struct Man *JM;
//方式二:定義結構體的時候直接取別名
typedef struct Woman{
char* name;
int age;
} W,*Wp;
Age i = 20;
Ap t = &i;
printf("%d\n",i);
printf("%d\n",*t);
//==================
W w = { "charles", 23 };
Wp wp = &w;
printf("%d,%s\n",wp->age,wp->name);
getchar();
}
*/
//結構體函數指針成員
typedef struct Girl {
char *name;
int age;
//函數指針
void(*sayHi)(char*);
} JGirl;
//Girl 結構體類似於Java中的類,name age 類似屬性 ,sayHi類似於方法
//Girl 結構體指針取別名
typedef struct Girl* Girlp;
void sayHello(char* str){
MessageBox(0, str, "Say Hi :", 0);
}
//Girlp == Girl*
void reName(Girlp glp){
glp->name = "Jhon";
}
void main(){
//原生創建結構體對象
struct Girl girl = {
"Lily", 22, sayHello
};
//用別名創建結構體對象
JGirl jgirl = {
"Lily", 22, sayHello
};
//原生創建結構體指針
struct Girl* girl = &girl;
//用結構體指針別名創建結構體指針
Girlp gp = &jgirl;
//傳遞指針,給結構體對象改名
reName(gp);
printf("%s\n",gp->name);
gp->sayHi("你好啊!");
//girl.sayHi("how are you !");
getchar();
}