为何用c的规范写了个程序源代码后缀为.c结果不能通过编译,换成.cpp后却编译通过了?(VS2012编译器)

为什么用c的规范写了个程序源代码后缀为.c结果不能通过编译,换成.cpp后却编译通过了??(VS2012编译器)
RT,明明是使用c的规范写的程序为什么只有源代码文件后缀改为.cpp才能通过编译(.c后缀会提示error)???求高手解释...
代码如下:
#include<stdio.h> 
#include<stdlib.h> 
typedef struct

char id[5];     // 学生学号 
char name[11];  // 学生名字 
int age;       // 学生年龄  
int math;      // 数学成绩  
int eng;       // 英语成绩  
int ds;        // 数据结构成绩 
int os;        // 操作系统成绩 
}Student_type; 

void Stu_print(Student_type print)
{    //按顺序输出数组内各个数据 
printf("Student id: %s\n",print.id);
printf("Student name: %s\n",print.name);
printf("Student age: %d\n",print.age); 
printf("Student math: %d\n",print.math); 
printf("Student eng: %d\n",print.eng); 
printf("Student ds: %d\n",print.ds); 
printf("Student os: %d\n",print.os); 


void  Stu_input(Student_type &dat)

printf("Please input student's id: "); 
scanf("%s",dat.id); 
printf("Please input student's name: "); 
scanf("%s",dat.name); 
printf("Please input student's age: "); 
scanf("%d",&dat.age); 
printf("Please input student's math: "); 
scanf("%d",&dat.math); 
printf("Please input student's eng: "); 
scanf("%d",&dat.eng); 
printf("Please input student's ds: "); 
scanf("%d",&dat.ds); 
printf("Please input student's os: "); 
scanf("%d",&dat.os); 


int main()

int i,stunum=0; 

Student_type *data; 
printf("Input stunum: "); 
scanf("%d",&stunum);        //记录需要开辟的空间 

data=(Student_type *)malloc(stunum*sizeof(Student_type)); 

for(i=0;i<stunum;++i)

Stu_input(*(data+i)); 
}

for(i=0;i<stunum;++i)

Stu_print(*(data+i)); 
}

free(data); 

system("pause");
return 0; 
}

编译器 c

------解决方案--------------------
第二十五行
void  Stu_input(Student_type &dat)
传参数不能加&,c语言不支持引用
------解决方案--------------------
void  Stu_input(Student_type &dat)
改为
void  Stu_input(Student_type* dat)
里面改为->

for(i=0;i<stunum;++i)
    { 
        Stu_input(*(data+i)); 
    }
 
    for(i=0;i<stunum;++i)
    { 
        Stu_print(*(data+i)); 
    }

你这两个也有问题 你只malloc了一个data  却去遍历stunum个结构 代码也跑不起来