在堆上分配内存 并用二级指针做输出:
//结构体数组 3 输入老师年龄 排序
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#include<ctype.h>
typedef struct teacher
{
char name[64];
int age;
int id;
}teacher;
void printfTeacher(teacher*array, int num)
{
int i = 0;
for (i = 0;i < num;i++)
{
printf("age:%d\n", (array[i].age));
}
}
void sortTeacher(teacher*array, int num)
{
int i, j;
teacher tmp;
for (i = 0;i < num;i++)
{
for (j = i + 1;j < num;j++)
{
if (array[i].age > array[j].age)
{
tmp = array[i];
array[i] = array[j];
array[j] = tmp;
}
}
}
}
//数组名就是指针
int createTeacher(teacher**pT/*out*/, int num)
{
int i = 0;
teacher*tmp = NULL;
tmp = (teacher*)malloc(sizeof(teacher)*num);//teacher Array[3];
if (tmp == NULL)
{
return -1;
}
memset(tmp,0,sizeof(teacher)*num);//刚分配完后 立马初始化
//pT二级指针 *pT就是一级指针 也就是pArray的地址
*pT = tmp;//二级指针 形参 去间接修改实参的值
return 0;
}
void freeTeacher(teacher*p,int num)
{
if (p != NULL)
{
free(p);
}
}
void main31()
{
int ret;
int i = 0;
int num = 3;
teacher*pArray = NULL;
ret=createTeacher(&pArray,num);
if(ret!=0)
{
printf("funerr_createTeacer()");
return;
}
for (i = 0; i < num; i++)
{
printf("\nplease enter age:");
scanf_s("%d", &(pArray[i].age));
printf("\nplease enter name:");
scanf_s("%s", pArray[i].name); //向指针(因为name是一个数组 所以就是一个指针)所指向的内存空间拷贝数据
}
printfTeacher(pArray, num);
sortTeacher(pArray, num);
printf("排序之后\n");
printfTeacher(pArray, num);
printf("hehehe\n");
system("pause");
return;
}
为什么age需要取地址 而name不需要?
printf("\nplease enter age:");
scanf_s("%d", &(pArray[i].age));
printf("\nplease enter name:");
scanf_s("%s", pArray[i].name); //向指针(因为name是一个数组 所以就是一个指针)所指向的内存空间拷贝数据
//name是一个数组 取地址的话只会向它的首元素赋值数据
//name就不用取地址了 因为name是一个数组 数组名就是一个指针 也就是一个地址 所以不用取地址了
//所以age需要取地址 name本身就是地址 所以不用取地址