c语言结构体函数指针
‘壹’ c语言结构体内部的函数指针有什么意义
//在结构体中包含函数指针,
//这样,可以使用结构体,调用函数。
//这个有点像C++的面向对象的类
//十分好用。
#include"stdio.h"
structDEMO
{
intx,y;
int(*func)(int,int);//函数指针
};
intadd2(intx,inty)
{
returnx+y;
}
intmain()
{
intret=0;
structDEMOdemo;
demo.func=&add2;//结构体函数指针赋值
ret=demo.func(3,4);
printf("func(3,4)=%d ",ret);
}
‘贰’ C语言中如何在结构体里写函数,指向函数指针问题。
改动如下:
#include <stdio.h>
#include<string.h>
enum gender
{
male,famale
};
typedef struct course
{
char coursename[10];
int coursescore;
}STC;
typedef struct student
{
long studentnumber;
char name[20];
int age;
enum gender sex;
STC coursescore[3];
struct student *next;
void (*ptooutput)(struct student*); // 改动1:改成指针,与output函数匹配
}STD;
void output(struct student *p)
{
int i;
printf("学生%s:\n",p->name);
printf("他的学号是%ld\n",p->studentnumber); // 改动2:学号
printf("他的年龄是%d\n",p->age); // 改动3:年龄
if(p->sex==0)
{printf("他的性别是男\n");}
else
{printf("他的性别是女\n");}
for(i=0;i<3;i++)
{
printf("他的%s",p->coursescore[i].coursename);
printf("成绩是%d\n",p->coursescore[i].coursescore);
}
}
main()
{
STD a;
a.studentnumber=1011110201;
strcpy(a.name,"叶超");
a.age=19;
a.sex=male;
strcpy(a.coursescore[0].coursename,"数学");
a.coursescore[0].coursescore=87;
strcpy(a.coursescore[1].coursename,"英语");
a.coursescore[1].coursescore=72;
strcpy(a.coursescore[2].coursename,"C语言");
a.coursescore[2].coursescore=66;
a.ptooutput = output; // 改动4:设置打印函数指针
a.ptooutput(&a); // 改动5:输入参数为指针
}
‘叁’ c语言如何给结构体指针赋值
结构体数组指针作为函数参数,通过数组的首地址与偏移量对结构体数组进行scanf的赋值,在函数中通过指针间接访问到其指向的内存。
举例:编写函数,输入5个学号(int),5个姓名(字符串),5个成绩数组(每组三个成绩)(int[3]),依次调用函数
#include <stdio.h>
#include <stdlib.h>
struct student //建立结构体,学号,姓名,3门课的分数
{
int num;
char name[10];
int score[3];
}Stu[5]; //初始化,一共5个学生的数据
void getScore(struct student * p) //函数:向结构体读取分数,一共三门课
{
int i, j;
for (i = 0; i < 5; i++)
for (j = 0; j < 3; j++)
scanf_s("%d", (&(p+i)->score[j]));
}
void getNum(struct student * p) //函数:向结构体读取学号
{
int i;
for (i = 0; i < 5;i++)
scanf_s("%d", &(p + i)->num);
}
void getName(struct student * p) //函数:向结构体读取姓名
{
int i;
for (i = 0; i < 5; i++)
scanf("%s", &(p + i)->name);
}
int main()
{
int i, j, average[3] = { 0 }; //average数组储存每门课的平均分
getNum(Stu); //函数调用
getName(Stu);
getScore(Stu);
for (j = 0; j < 3; j++)
{
for (i = 0; i < 5; i++)
average[j] += Stu[i].score[j];
}
for (i = 0; i < 5; i++)
{
printf("num = %d name = %s Score:", Stu[i].num, Stu[i].name); //依次打印学号 姓名
//printf("%d %d %d", Stu[0].score[0],Stu[0].score[1],Stu[0].score[2]);
for (j = 0; j < 3; j++) //打印三门课的分数
printf(" %d", Stu[i].score[j]);
printf(" ");
}
printf("average:");
for (i = 0; i < 3; i++)
printf("%f ", (float)average[i]/5); //打印三门课平均分
printf(" ");
system("pause");
return 0;
}
如:
scanf("%c%c%c",&a,&b,&c);
输入为:
d e f
则把'd'赋予a, ' '(空格)赋予b,'e'赋予c。因为%c 只要求读入一个字符,后面不需要用空格作为两个字符的间隔,因此把' '作为下一个字符送给b。
只有当输入为:def(字符间无空格) 时,才能把'd'赋于a,'e'赋予b,'f'赋予c。
‘肆’ c语言函数指针作为结构体的问题
首先解释一下
&st
的问题吧:&st
就是取结构体的
st
的地址传给结构体内的函数
p
和
o,
根据前面
st
的定义,也就是传给
print
和
power。这样
print
和
power
函数就可以读取结构体中的
i
和
x
值。
然后沿着各个思路,可以写出
print
和
power
函数,如下:
void
print(ST
*st){
printf
("%g",
st->x);
}
void
power(ST
*st){
int
k;
double
y=1;
for
(k=0;k
i;k++)
y*=st->x;
st->x
=
y;
}
不过这里有个问题,就是你之前的
struct
中定义的函数指针是没有参数的,但是主函数调用时是有参数的,这是矛盾的呀。要改一下:
struct
ST{
int
i;
double
x;
void
(*o)(ST*);
void
(*p)(ST*);
}
;
就没有问题了。
‘伍’ C语言:在结构体内部定义函数指针
functionpointer就是函数指针,指向一个函数,该函数的原型类似
void function(pStruct_X * p)
P.functionpointer,就等于是调用该函数了。
不过你的代码中,没写初始化,到底这个函数指针是指向哪个函数。
‘陆’ C语言函数怎么传结构体指针
#include<stdio.h>
#include<stdlib.h>
#defineLINE_MAX80
structbody{
chardata[100];//要定义成数组才可以,不然,还要去分配内存
intnum;
};
voidcreate(structbody*bd);//结构体定义后,才能使用结构体类型,所以,移动到定义之后
intmain(intargc,char*argv[]){
intchoose;
structbody*bd;
bd=(structbody*)malloc(sizeof(structbody));
while(1)
{
printf("*******************欢迎来到文章编辑系统******************** ");
printf("1.创建新文本 ");
printf("2.统计文本 ");
printf("5.退出系统 ");
printf("请选择你需要的功能的序号:");
scanf("%d",&choose);
switch(choose)
{
case1:
printf("创建新文本 ");
create(bd);
continue;
case2:
printf("统计文本 ");
continue;
case5:
printf("谢谢您的使用! ");
break;
default:
printf("请正确输入! ");
continue;
}
if(choose==5)
break;
}
return0;
}
voidcreate(structbody*bd)
{
printf("编辑文本,Enter键保存 ");
scanf("%s",bd->data);//结构体指针引用成员用->,同时,格式串应该是%s
printf("您输入的文本是:%s ",bd->data);//同上
}
‘柒’ C语言结构体的函数指针会不会乱指
指针声明就已经确定他可以指向哪一种类型的变量了,比如整形指针……,函数指针只能指向它声明时参数类型返回值类型相同的函数,否则会和用整型指针指向浮点型数据一样不能通过