用变量a给出下面的定义
- a) 一个整型数
- (An integer) //int a;
- b) 一个指向整型数的指针
- (A pointer to an integer) //int *a;
- c) 一个指向指针的的指针,它指向的指针是指向一个整型数
- (A pointer to a pointer to an integer) //int * *a;(二级指针)
- d) 一个有10个整型数的数组
- (An array of 10 integers) //int a[10];
- e) 一个有10个指针的数组,该指针是指向一个整型数的
- (An array of 10 pointers to integers) //int *a[10];
- f) 一个指向有10个整型数数组的指针
- (A pointer to an array of 10 integers) //int (*a)[10];
- g) 一个指向函数的指针,该函数有一个整型参数并返回一个整型数
- (A pointer to a function that takes an integer as an argument and returns an integer) //int (*a)(int)
- h) 一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数
- ( An array of ten pointers to functions that take an integer argument and return an integer ) //int (*a[10])(int)
函数传参-----值传递
总结:
1.指针概念
2.指针定义
3.核心用途
4.指针运算
5.指针
一维
6.指针+二维数组
7.指针+函数
8.指针+指针
结构体、共用体、枚举
数据类型:
基本数据类型:整型 浮点型 字符型 枚举类型
构造类型:数组类型
指针类型
void类型
例子:统计全校同学信息
//记录统计学生信息
//姓名
//班级
//性别
//成绩
//年龄......
记录姓名--------char s[][100] = {"Tom","Gerry"};
记录班级---------char class[][100] = {"......"};
......
为了更好的描述 有一种专门的数据类型来描述
结构体 struct
描述一些原先基本数据类型不好描述的复杂数据类型
语法
struct 结构体类型名
{
数据成员列表 //成员变量
};
//一上这种形式就是定义了一个"数据类型"-----用户可以自定义
eg:描述学生这种类型
struct student
{
char name [20];
unsigned char age;
float score;
}; //注意:结束要用分号 表示结构体类定义完成
结构体的对齐规则:
1.在32位的平台上,默认都是按4字节对齐的。
2.对于成员变量,
各自在自己的自然边界上对齐。
3.如果 成员变量中有比4字节大。
此时整个结构体按照4字节对齐。
4.如果成员变量中没有有比4字节大。
此时整个结构体按照最大的那个成员对齐。
练习:
用结构体打印老师的姓名、工号、工资:
#include <stdio.h>
#if 0
struct teacher
{
char name[10];
int Jobnum;
int salary;
};
void Peintf_Teacher(struct teacher *a)
{
printf("-|name-|\t|-Jobnum-|\t|-salary|-\n");
printf("-|%s-|\t|-%d-|\t|-%d-|-\t\n",a->name,a->Jobnum,a->salary);
}
int main(void)
{
struct teacher a={"Liuyang",88888,88488};
#if 0
printf("-|name-|\t|-Jobnum-|\t|-salary|-\n");
printf("-|%s-|\t|-%d-|\t|-%d-|-\t\n",a.name,a.Jobnum,a.salary);
#endif
printf ("name: \n");
scanf("%s",a.name);
printf ("Jobnum: \n");
scanf("%d",&a.Jobnum);
printf ("salary: \n");
scanf("%d",&a.salary);
Peintf_Teacher(&a);
return 0;
}
结构体搭建学生信息查询系统
#include <stdio.h>
#include <stdlib.h>
struct student
{
char name[20];
int sno;
float score;
};
void inputStuInfo(struct student *p,int len)
{
int i = 0;
for (i = 0; i < len;++i)
{
printf("name:");
scanf("%s",(p+i)->name);
printf("sno :");
scanf("%d",&(p+i)->sno); //p[i].name
printf("score:");
scanf("%f",&(p+i)->score);
}
}
void outputStuInfo(struct student *p,int len)
{
int i = 0;
printf("%10s|%10s|%10s\n","name","sno","score");
for (i = 0; i < len;++i)
{
printf("%10s",p->name);
printf("%10d",p->sno);
printf("%10.2f\n",p->score);
p++;
}
}
void printMenu(void)
{
printf("-----Welcome Use Student info System-----\n");
printf("1 选择输入的学生人数\n");
printf("2 输入信息\n");
printf("3 查看学生信息\n");
printf("0 退出 \n");
printf(">");
}
int main(void)
{
int n;
int len = 0;
struct student *s;
while (1)
{
printMenu();
scanf("%d",&n);
switch(n)
{
case 0:
printf("exit----\n");
return 0;
case 1:
printf(">");
scanf("%d",&len);
s = malloc(len*sizeof(struct student));
break;
case 2:
inputStuInfo(s,len);
break;
case 3:
outputStuInfo(s,len);
break;
}
}
return 0;
}
注意:
1.结构体------是用来实现自定义数据类型
2.用结构体
a.先构造出数据类型
b.用数据类型定义变量、数组、指针
访问结构体
. //结构体成员运算符
--->用与结构体类型的指针变量
eg. p--->name
作业:
有一个班的4个学生,有5门课程。
1、求第一门课的平均分; struct Stu s[4]; s[i].score[0] int averageOneClass(struct Stu *s,int len,int classNo)
2、找出有两门以上课程不及格的学生, 输出他们的学号和全部课程成绩及平均分 printfStuInfoFailTwoClass()
{ 1.统计学生不及格课程数 2.打印学生信息 3.求平均分的功能 }
3、找出平均分在90分以上或全部课程成绩在85分以上的学生。 分别编写三个函数来实现以上三个要求
#include <stdio.h>
struct Stu //结构体函数
{
char name[10];
int num;
float yuwen;
float yingyu;
float shuxue;
float wuli;
float huaxue;
};
//****************************************************************
void Intput_Stu(struct Stu *s,int len) //输入各项元素
{
int i=0;
for (i=0;i<len;++i)
{
printf ("name: ");
scanf("%s",(s+i)->name);
printf ("num: ");
scanf("%d",&(s+i)->num);
printf ("yuwen: ");
scanf("%f",&(s+i)->yuwen);
printf ("yingyu: ");
scanf("%f",&(s+i)->yingyu);
printf ("shuxue: ");
scanf("%f",&(s+i)->shuxue);
printf ("wuli: ");
scanf("%f",&(s+i)->wuli);
printf ("huaxue: ");
scanf("%f",&(s+i)->huaxue);
}
}
//*********************************************************
void Puts_Stu(struct Stu *s,int len) //输出
{
int i=0;
for (i=0;i<len;++i)
{
printf ("%s\t",s->name);
printf ("%d\t",s->num);
printf ("%.1f\t",s->yuwen);
printf ("%.1f\t",s->yingyu);
printf ("%.1f\t",s->shuxue);
printf ("%.1f\t",s->wuli);
printf ("%.1f\n",s->huaxue);
s++;
}
}
//****************************************************
float Pingjun_Stu(struct Stu *s,int len)
{
int i=0;
float sum=0;
//单科语文平均数计算
for (i=0;i<len;++i)
{
sum += (s+i)->yuwen;
}
return sum/len;
}
//***************************************************************************************************************************
void Flunk_Stu(struct Stu *s,int len)
{
int i=0; //求不及格学生的科目和成绩及其平均分
int j=0;
float sum=0;
for (i=0;i<len;++i)
{
if ((s+i)->yuwen<60)
{
++j;
}
if ((s+i)->yingyu<60)
{
++j;
}
if ((s+i)->shuxue<60)
{
++j;
}
if ((s+i)->wuli<60)
{
++j;
}
if ((s+i)->huaxue<60)
{
++j;
}
if (j>=2)
{
printf("两门以上不及格的同学:num:%d yuwen:%.1f yingyu:%.1f shuxue:%.1f wuli:%.1f huaxue:%.1f\n",(s+i)->num,(s+i)->yuwen,(s+i)->yingyu,(s+i)->shuxue,(s+i)->wuli,(s+i)->huaxue);
sum=(s+i)->yuwen+(s+i)->yingyu+(s+i)->shuxue+(s+i)->wuli+(s+i)->huaxue;
printf("这位同学的平均分是:%.1f\n",sum/5);
printf("不及格有%d门\n",j);
}
j=0;
}
}
//*****************************************************************
void CHAzhao_Stu(struct Stu *s,int len)
{ //查找成绩优异的同学
int i=0;
int sum=0;
for (i=0;i<len;++i)
{
sum=(s+i)->yuwen+(s+i)->yingyu+(s+i)->shuxue+(s+i)->wuli+(s+i)->huaxue;
if (((s+i)->yuwen>85 && (s+i)->yingyu>85 && (s+i)->shuxue>85 && (s+i)->wuli>85 && (s+i)->huaxue>85) || sum/5>95)
{
printf("成绩优异的同学:name:%s num:%d yuwen:%.1f yingyu:%.1f shuxue:%.1f wuli:%.1f huaxue:%.1f\n",(s+i)->name,(s+i)->num,(s+i)->yuwen,(s+i)->yingyu,(s+i)->shuxue,(s+i)->wuli,(s+i)->huaxue);
}
}
}
//*****************************************************
int main (void)
{
struct Stu s[4];
int len=4;
Intput_Stu(s,len);
printf ("--------------------统计表-------------------\n");
printf ("name\tnum\tyuwen\tyingyu\tshuxue\twuli\thuaxue\n");
Puts_Stu(s,len);
// float p=Pingjun_Stu(s,len); //调用平均数函数
// printf ("语文平均分是:%.1f\n",p); //打印出平均数的结果
// Flunk_Stu(s,len); // 调用求不及格科目的函数
CHAzhao_Stu(s,4);
return 0;
}