C語言結構體專題

it_xiangqiang發表於2020-10-31

1大綱
01、結構體型別定義及結構體變數定義
char c1,char c2, char name[62]; int age
char name[62]; int age,char c1,char c2
結構體變數的引用 .
結構體變數的指標 ->

02、結構體做函式引數
結構體賦值編譯器行為研究
結構體變數做函式引數 PK 結構體指標做函式引數
結構體做函式引數(//結構體賦值和實參形參賦值行為研究)
記憶體四區呼叫圖畫法

//從鍵盤獲取資料,給結構體變數初始化,並排序,列印結構體
stack上分配結構陣列和heap上分配結構體陣列

03、工程開發中,結構體開發的常見模型及典型錯誤用法
結構體巢狀一級指標
結構體巢狀二級指標
04、結構體中的深拷貝淺拷貝
問題丟擲
解決方法

2結構體型別定義及變數定義
/*
//結構體型別定義及結構體變數定義
結構體是一種構造資料型別
用途:把不同型別的資料組合成一個整體-------自定義資料型別
結構體型別定義
*/
//宣告一個結構體型別
struct _Teacher
{
char name[32];
char tile[32];
int age;
char addr[128];
};

//定義結構體變數的方法
/*
1)定義型別 用型別定義變數
2)定義型別的同時,定義變數;
3)直接定義結構體變數;
*/

struct _Student
{
char name[32];
char tile[32];
int age;
char addr[128];
}s1, s2; //定義型別的同時,定義變數;

struct
{
char name[32];
char tile[32];
int age;
char addr[128];
}s3,s4; //直接定義結構體變數

//初始化結構體變數的幾種方法
//1)
struct _Teacher t4 = {“name2”, “tile2”, 2, “addr2”};
//2)
struct Dog1
{
char name[32];
char tile[32];
int age;
char addr[128];
}d5 = {“dog”, “gongzhu”, 1, “ddd”};

//3)
struct
{
char name[32];
char tile[32];
int age;
char addr[128];
}d6 = {“dog”, “gongzhu”, 1, “ddd”};
//結構體變數的引用

int main11()
{
//struct _Teacher t1, t2;
//定義同時初始化
{
struct _Teacher t3 = {“name2”, “tile2”, 2, “addr2”};
printf("%s\n", t3.name);
printf("%s\n", t3.tile);
}
//用指標法和變數法分別操作結構體
{
struct _Teacher t4;
struct _Teacher *pTeacher = NULL;
pTeacher = &t4;
strcpy(t4.name, “wangbaoming”);
strcpy(pTeacher->addr, “ddddd”);
printf(“t4.name:%s\n”, t4.name);
}
printf(“hello…\n”);
getchar();
return 0;
}

3結構體做函式引數及結構體陣列
//測試兩個結構體變數之間可以copy資料嗎?
//t2 = t1;
//測試實參傳給形參,編譯器的行為
//結果很出人意外
//宣告一個結構體型別
struct _MyTeacher
{
char name[32];
char tile[32];
int age;
char addr[128];
};

void printfMyteach01(struct _MyTeacher t)
{
printf("\nt.name:%s", t.name);
}

void printfMyteach02(struct _MyTeacher *t)
{
printf("\nt->name:%s", t->name);
}
//結構體賦值和實參形參賦值行為研究
int main21()
{
struct _MyTeacher t1, t2;
memset(&t1, 0, sizeof(t1));
strcpy(t1.name, “name”);
strcpy(t1.addr, “addr”);
strcpy(t1.tile, “addr”);
t1.age = 1;
//測試兩個結構體變數之間可以copy資料嗎?
//t2 = t1;
//測試實參傳給形參,編譯器的行為
//結果很出人意外
printfMyteach01(t1);
printfMyteach02(&t1);
getchar();
return 0;
}

//定義結構體陣列
int main22()
{
int i = 0;
struct _MyTeacher teaArray[3];
struct _MyTeacher *tmp = NULL;
for (i=0; i<3; i++)
{
strcpy(teaArray[i].name, “aaaaa”);
//printf("%s", teaArray[i].name);
tmp = &teaArray[i];
printf("%s", tmp->name);
}
getchar();
return 0;
}

例子
從鍵盤接受資料。。。。並排序
int printfArray(struct _MyTeacher *teaArray, int count)
{
int i = 0;
//列印
for (i=0; i<count; i++)
{
printf("\n教師名字:");
printf("%s", teaArray[i].name);
printf("\n教師年齡:");
printf("%d", teaArray[i].age);
}

}
int main23()
{
int i = 0, j = 0;
struct _MyTeacher teaArray[3];
struct _MyTeacher tmp;
for (i=0; i<3; i++)
{
printf("\n請鍵入教師名字:");
scanf("%s", teaArray[i].name);
printf("\n請鍵入教師年齡:");
scanf("%d", &teaArray[i].age);
}
for (i=0; i<3; i++)
{
for (j=i+1; j<3; j++)
{
if (teaArray[i].age >teaArray[j].age)
{
tmp = teaArray[i];
teaArray[i] = teaArray[j];
teaArray[j] = tmp;
}
}
}
//列印
for (i=0; i<3; i++)
{
printf("\n教師名字:");
printf("%s", teaArray[i].name);
printf("\n教師年齡:");
printf("%d", teaArray[i].age);
}
printf(“ddddd\n”);
printfArray(teaArray, 3);
system(“pause”);

}

4結構體在工程開發中的應用
//測試輸入
//測試列印
//測試malloc
//測試typdef用法
//定義結構體陣列

struct _Student
{
char name[32];
char tile[32];
};

//宣告一個結構體型別
struct _itTeacher
{
char name[32];
char tile[32];
int age;
char addr[128];
};

struct _itAdvTeacher
{
char *name;
char *tile;
int age;
char *addr;
char *p1;
char **p2;
};

//測試輸入
//測試列印
//測試malloc
//測試typdef用法

//定義結構體陣列
int main()
{
int i = 0;
struct _itTeacher teaArray[3];
struct _itTeacher *tmp = NULL;
for (i=0; i<3; i++)
{
strcpy(teaArray[i].name, “aaaaa”);
//printf("%s", teaArray[i].name);
tmp = &teaArray[i];
printf("%s", tmp->name);
}
getchar();
return 0;
}

//記憶體四位元組對齊
在這裡插入圖片描述
//結構體實參傳給形參,也是一個值copy,相當於t1 = t2;
//兩個結構體變數之間確實是可以copy,這個是編譯器的行為,我們需要順從

相關文章