c_04 結構體—important

#define _CRT_SECURE_NO_WARNINGS
#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;


void main(){
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();
}
發佈了41 篇原創文章 · 獲贊 19 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章