请问一下函数中建立了动态变量但是不能输入

#include
#include
using namespace std;
struct student
{ char name[80];
char num[20];
float a,b,c,d;
float x,y;
};
void lb (student *, int );
int main (void)
{
int n;
student *p;
cout<<"输入学生个数:"<<endl;
cin>>n; lb(p,n);
system("pause");
return 0;
}
void lb (student q , int m)
{
q=(student
)malloc(sizeof(student)*m);
if(q=NULL)
{
cout<<"error!"<<endl;
exit (1);
}
for(int i=0 ; i<m ; i++)
{
cout<<"输入名字:";
cin.getline(q[i].name ,80);
cout<<"学号:";
cin.getline(q[i].num ,20);
cout<<"学科1:";
cin>>q[i].a;
cout<<"学科2:";
cin>>q[i].b;
cout<<"学科3:";
cin>>q[i].c;
cout<<"学科4:";
cin>>q[i].d;
q[i].y=q[i].a+q[i].b+q[i].c+q[i].d;
q[i].x=q[i].y/4.f;
}

如果一个函数的参数是指针,如果传入一个一级指针,无论在函数内部如何修改这个指针,函数结束后,这个指针依然是传入之前的量,所以要让指针参数能够把函数内部的操作返回出来,那么需要二级指针