第一篇:C语言结构体指针变量作函数参数
C语言结构体指针变量作函数参数
在ANSI C标准中允许用结构变量作函数参数进行整体传送。但是这种传送要将全部成员逐个传送,特别是成员为数组时将会使传送的时间和空间开销很大,严重地降低了程序的效率。因此最好的办法就是使用指针,即用指针变量作函数参数进行传送。这时现金网96y.org由实参传向形参的只是地址,从而减少了时间和空间的开销。
计算一组学生的平均成绩和不及格人数。用结构指针变量作函数参数编程。
struct stu{
int num;
char *name;
char sex;
float score;
}boy[5]={
{101,Li ping,M,45},{102,Zhang ping,M,62.5},{103,He fang,F,92.5},{104,Cheng ling,F,87},{105,Wang ming,M,58}
};
main(){
struct stu *ps;
void ave(struct stu *ps);
ps=boy;
ave(ps);
}
void ave(struct stu *ps){
int c=0,i;
float ave,s=0;
for(i=0;i5;i++,ps++){
s+=ps-score;
if(ps-score60)c+=1;
}
printf(s=%fn,s);
ave=s/5;
printf(average=%fncount=%dn,ave,c);
}
本程序中定义了函数ave,其形参为结构指针变量ps。boy被定义为外部结构数组,因此在整个源程序中有效。在main函数中定义说明了结构指针变量ps,并把boy的首地址赋予它,使ps指向boy数组。然后博彩娱乐棋牌q07i5.org以ps作实参调用函数ave。在函数ave中完成计算平均成绩和统计不及格人数的工作并输出结果。
由于本程序全部采用指针变量作运算和处理,故速度更快,程序效率更高。
第二篇:C语言函数指针变量
C语言函数指针变量
在C语言中,一个函数总是占用一段连续的内存区,而函数名就是该函数所占内存区的首地址。我们可以把函数的这个首地址(或称入口地址)赋予一个指针变量,使该指针变量指向该函数。然后通过指针变量就可以找到并调用这个函数。我们把这种指向函数的指针变量称为函数指针变量。
函数指针变量定义的一般形式为:
类型说明符(*指针变量名)();其中类型说明符表示现金网96y.org被指函数的返回值的类型。(* 指针变量名)表示*后面的变量是定义的指针变量。最后的空括号表示指针变量所指的是一个函数。例如:
int(*pf)();
表示pf是一个指向函数入口的指针变量,该函数的返回值(函数值)是整型。
本例用来说明用指针形式实现对函数调用的方法。
int max(int a,int b){
if(ab)return a;
else return b;
}
main(){
int max(int a,int b);
int(*pmax)();
int x,y,z;
pmax=max;
printf(input two numbers:n);
scanf(%d%d,x,y);
z=(*pmax)(x,y);
printf(maxmum=%d,z);
}
从上述程序可以看出用,函数指针变量形式调用函数的步骤如下:
先定义函数指针变量,如后一程序中第9行 int(*pmax)();定义 pmax为函数指针变量。
把被调函数的入口地址(函数名)赋予该函数指针变量,如程序中第11行 pmax=max;
用函数指针变量形式调用函数,如程序第14行 z=(*pmax)(x,y);
调用函数的一般形式为:(*指针变量名)(实参表)
使用函数指针变量还应注意以下两点:
函数指针变量不能进行算术运算,这是与数组指针变量不同的。数组指针变量加减一个整数可使指针移动指向后面或前面的数组元素,而博彩娱乐棋牌q07i5.org函数指针的移动是毫无意义的。
函数调用中(*指针变量名)的两边的括号不可少,其中的*不应该理解为求值运算,在此处它只是一种表示符号。
第三篇:C语言结构体与指针实验
实验一 C语言结构体与指针
一、实验内容
1)学生信息的显示,具体要求如下: 定义一个结构体描述学生信息(学号,姓名,性别,年龄,住址); 设计一个函数,用于显示单个学生信息,函数的参数为前面定义的结构体类型; 设计一个主函数,在主函数中输入学生的信息,并调用前面定义的函数进行显示(学生人数不少于5人)。
2)输入若干个整数作为数组元素值,然后按输入时顺序的就地逆置排序,最后打印出逆置后的元素值。要求用指针和动态内存分配方法实现。例如 输入:10 2 30 4 5,逆置后显示为:5 4 30 2 10。
二、代码
1)#include
struct Student { int studentID;char name[20];char sex[2];//m=male f=female int age;char address[50];};
void showTheDetail(struct Student s){ printf(“%dn”,s.studentID);printf(“%sn”,s.name);printf(“%sn”,s.sex);printf(“%dn”,s.age);printf(“%snn”,s.address);}
void main(){ int i;struct Student student[5];for(i=0;i<5;i++){
printf(“student%dn”,i);
scanf(“%d”,&student[i].studentID);
}
scanf(“%s”,&student[i].name);scanf(“%s”,&student[i].sex);scanf(“%d”,&student[i].age);scanf(“%s”,&student[i].address);} for(i=0;i<5;i++){ showTheDetail(student[i]);} 2)#include
int temp,i,j,m=(n-1)/2;
for(i=0;i<=m;i++)
{
j=n-1-i;
temp=x[i];x[i]=x[j];x[j]=temp;
}
return;}
int main(){
int n,i;printf(“please insert the amount of the numbers:n”);scanf(“%d”,&n);int array[n];printf(“please insert the numbers:n”);for(i=0;i scanf(“%d”,&array[i]);} change(array,n);for(i=0;i printf(“%d”,array[i]);} } 三、心得体会 复习了c语言中的数组,结构体的知识,编程中没有出现问题。 C语言指向结构体数组的指针 指针变量可以指向一个结构数组,这时结构指针变量的值是整个结构数组的首地址。结构指针变量也可指向结构数组的一个元素,这时结构指针变量的值是该结构数组元素的首地址。 设ps为指向结构数组的指针变量,则ps也指向该结构数组的0号元素,ps+1指向1号元素,ps+i则指向i号元素。这与普通数组的情况现金网96y.org是一致的。 用指针变量输出结构数组。 struct stu{ int num; char *name; char sex; float score; }boy[5]={ {101,Zhou ping,M,45},{102,Zhang ping,M,62.5},{103,Liou fang,F,92.5},{104,Cheng ling,F,87},{105,Wang ming,M,58} }; main(){ struct stu *ps; printf(NotNametttSextScoretn); for(ps=boy;psboy+5;ps++) printf(%dt%stt%ct%ftn,ps-num,ps-name,ps-sex,ps-score); } 在程序中,定义了stu结构类型的外部数组boy并作了初始化赋值。在main函数内定义ps为指向stu类型的指针。在循环语句for的表达式1中,ps被赋予boy的首地址,然后循环5次,输出boy数组中各成员值。 应该注意的是,一个结构指针变量虽然可以用来访问结构变量或结构数组元素的成员,但是,不能博彩公司排名q07i5.org使它指向一个成员。也就是说不允许取一个成员的地址来赋予它。因此,下面的赋值是错误的。 ps=boy[1].sex; 而只能是: ps=boy;(赋予数组首地址) 或者是: ps=boy[0];(赋予0号元素首地址) C++的struct和class差别很小,其实class就是从struct发展出来的。struct定义的结构体在C++中也是一个类,结构体可以有class的任何东西 struct AA { public: int a; int b; private: int a; int b; protected: int GetA()const; void SetA(); public: int GetB()const; AA & operator=(const AA & a); public: AA(); AA(const AA & a); }; 可以看到struct和class没有区别,唯一的区别是,如果没有写public、private等,struct缺省是公有成员,class缺省是私有的。第四篇:C语言指向结构体数组的指针
第五篇:结构体的构造函数