1. 程式人生 > >C語言之結構體巢狀一級指標和二級指標

C語言之結構體巢狀一級指標和二級指標

指標是C語言的精華,也是c中最難的部分;為了鍛鍊和提高自己對指標的理解,特在結構體中巢狀一級指標和二級指標來加深對。

#include<stdio.h>
#include <string.h>
#include<stdlib.h>
#define false 0
#define true 1

//結構體型別,每個導師有三個學生
typedef struct Tea
    {
    char *tName; //導師名字,需要動態分配空間char *====>char
    char **stu;  //三個學生,需要動態分配空間,堆區陣列
    int age;
    }Teacher;

//在createTeacher中分配空間
//n1 =3; //導師個數 //n2 = 3 //學生 int createTeacher(Teacher **p, int n1, int n2) { int len=0; int i,j,k; //分配3個Student資訊 *p = (Teacher*)malloc (sizeof(Teacher)*3); for (i=0;i<n1;i++) //分配3個導師的地址空間 { (*p)[i].tName=(char *)malloc (sizeof(char)*20); if ((*p)[i].tName == NULL) { return
false; } } //(*p)->stu=(char **)malloc (sizeof(char*)*3); for (j=0;j<n2;j++) { (*p)[j].stu=(char **)malloc (sizeof(char)*3); if ((*p)[j].stu == NULL) { return false; } for (k=0;k<3;k++) { (*p)[j].stu[k]=(char
*)malloc (sizeof(char)*20); if ((*p)[j].stu[k] == NULL) { return false; } } } return true; } //給成員賦值 void initTeacher(Teacher *p, int n1, int n2) { int i,j,k=0; // if (p == NULL) { printf ("error\n"); } //n1 =3; //導師個數 //n2 = 3 //學生 puts ("-----導師賦值------"); for (i=0;i<n1;i++) { char *buf[]={"王教授","陸教授","田導師"}; p[i].age=22+i; //printf ("%d",p[i].age); strcpy (p[i].tName,buf[i]); // printf ("%s",p[i].tName); for (j=0;j<n2;j++) { char *arr[]={"小黎","小田","小張","小王","小胡","小范", "小楊","小石","小柯"}; strcpy (p[i].stu[j],arr[k]); ++k; // printf ("%s\n",p[i].stu[j]); } } } //列印結構體成員資訊 void printTeacher(Teacher *p, int n1, int n2) { int i,j; if (p == NULL) { printf ("error\n"); } for (i=0;i<n1;i++) { printf ("\t\t%s\n",p[i].tName); //導師 for (j=0;j<n2;j++) { printf ("\t%s",p[i].stu[j]); } putchar('\n'); printf ("\t\t%d\n\n",p[i].age); } } //根據導師名字排序, 降序 void sortTeacher(Teacher *p, int n) { Teacher t1; int i,j; if (p==NULL) { printf ("error\n"); } for (i=0;i<n-1;i++) { for (j=i+1;j<n;j++) { if ((strcmp (p[i].tName,p[j].tName))>0) { t1=p[i]; p[i]=p[j]; p[j]=t1; } } } } //釋放空間,在函式內部把p賦值為NULL void freeTeacher(Teacher **p, int n1, int n2) { int i,j; if (p == NULL) { printf ("Empty\n"); } else { for (i=0;i<n1;i++) { for (j=0;j<n2;j++) { if (p[i]->stu[j]!=NULL) { free (p[i]->stu[i]); p[i]->stu[j]=NULL; } } if (p[i]->stu!= NULL) { free (p[i]->stu); p[i]->stu=NULL; } } } } int main(void) { int ret = 0; int n1 = 3; //導師個數 int n2 = 3; //學生 Teacher *p = NULL; ret = createTeacher(&p, n1, n2); if (ret == false) { printf("createTeacher err:%d\n", ret); exit (EXIT_FAILURE); } initTeacher(p, n1, n2); //給成員賦值 //列印成員,排序前 printf("排序前:\n"); printTeacher(p, n1, n2); //根據導師名字排序, 降序 sortTeacher(p, n1); //列印成員,排序後 printf("\n排序後:\n"); printTeacher(p, n1, n2); //釋放空間,在函式內部把p賦值為NULL //freeTeacher(&p, n1, n2); system("pause"); return 0; }

記憶體四區圖:
這裡寫圖片描述