
正文
c语言结构体与函数指针 c语言结构体和指针
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
C语言结构体内部的函数指针有什么意义
//在结构体中包含函数指针,
//这样,可以使用结构体,调用函数。
//这个有点像C++的面向对象的类
//十分好用。
#include "stdio.h"
struct DEMO
{
int x,y;
int (*func)(int,int); //函数指针
};
int add2(int x,int y)
{
return x+y;
}
int main()
{
int ret=0;
struct DEMO demo;
demo.func=add2; //结构体函数指针赋值
ret=demo.func(3,4);
printf("func(3,4)=%d\n",ret);
}
相关问答
Q1: C语言结构体程序子函数指针的使用
有多处错误,主程序中只有一处,但调用函数错得挺多的,最主要的是对结构指针的运用,
stu *p 下,引用其数组不能用(*p)[xx],因为p本身就是结构数组的首址,所以直接用p[xx]即可访问定义的所有单元。
以下将你的程序依原风格进行修改,主程序中将修改前的错误代码罗列于右,而order函数因为修改的地方多所以不再提示修改处:
#includestdio.h
typedef struct student
{
int num;
char name[20];
int a,b,c;
double ave;
}stu;
stu order(stu *p,int n);
int main()
{
stu s[6]; /*改为s[5]*/
int i;
for(i=0;i5;i++)
{
printf("input num:");
scanf("%d",s[i].num);
getchar();
printf("name:");
scanf("%s",s[i].name); /*原为scanf("%s",s[i].name); */
printf("a\tb\tc\n");
scanf("%d%d%d",s[i].a,s[i].b,s[i].c); s[i].ave=(s[i].a+s[i].b+s[i].c)*1.0/3;
}
order(s,5);
printf("num\tname\ta\tb\tc\n");
for(i=0;i5;i++)
{
printf("%d\t%s\t%d\t%d\t%d\t%lf\n",s[i].num,s[i].name,s[i].a,s[i].b,s[i].c,s[i].ave);
}
return 0;
}
stu order(stu *p,int n)
{
int j,k;
stu index;
for(j=0;jn-1;j++)
for(k=j+1;kn;k++)
if(p[j].avep[k].ave)
{
index=p[j];
p[j]=p[k];
p[k]=index;
}
}
Q2: c语言函数指针作为结构体的问题
首先解释一下
st
的问题吧:st
就是取结构体的
st
的地址传给结构体内的函数
p
和
o,
根据前面
st
的定义,也就是传给
和
power。这样
和
power
函数就可以读取结构体中的
i
和
x
值。
然后沿着各个思路,可以写出
和
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*);
}
;
就没有问题了。
Q3: 问一个C语言的结构体的函数指针和数组之间的问题
按c语言结构体与函数指针你原来那样写c语言结构体与函数指针,编译之后c语言结构体与函数指针,这样报错c语言结构体与函数指针:
[root@localhost test]# gcc 6.c
6.c:20: error: initializer element is not constant
6.c:20: error: (near initialization for ‘KeyboardTab[0].CurrentOperate’)
6.c:21: error: initializer element is not constant
6.c:21: error: (near initialization for ‘KeyboardTab[1].CurrentOperate’)
6.c:22: error: initializer element is not constant
6.c:22: error: (near initialization for ‘KeyboardTab[2].CurrentOperate’)
6.c:23: error: initializer element is not constant
6.c:23: error: (near initialization for ‘KeyboardTab[3].CurrentOperate’)
6.c:24: error: initializer element is not constant
6.c:24: error: (near initialization for ‘KeyboardTab[4].CurrentOperate’)
把源代码修改成这样:
KeyTabStruct KeyboardTab[43] =
{
{0 ,0 ,0 ,1 ,0 ,Menu0},
{1 ,1 ,1 ,2 ,42,Menu1},
{2 ,2 ,2 ,3 ,42,Menu2},
............
{41,41,41,42,40,Menu41},
{42,42,42,0 ,0 ,Menu42}
};
其余的不变,之后编译,结果为
[root@localhost test]# gcc 6.c
6.c:20: warning: initialization from incompatible pointer type
6.c:21: warning: initialization from incompatible pointer type
6.c:22: warning: initialization from incompatible pointer type
6.c:23: warning: initialization from incompatible pointer type
6.c:24: warning: initialization from incompatible pointer type
/usr/lib/gcc/i686-redhat-linux/4.4.4/../../../crt1.o: In function `_start':
(.text+0x18): undefined reference to `main'
collect2: ld returned 1 exit status
再加上main函数即可。
原因:指针即地址,函数指针也不例外,调用函数指针的时候,用的是函数所在的地址,“”是取地址符。
Q4: C语言:在结构体内部定义函数指针?
functionpointer就是函数指针,指向一个函数,该函数的原型类似
void function(pStruct_X * p)
P.functionpointer,就等于是调用该函数了。
不过你的代码中,没写初始化,到底这个函数指针是指向哪个函数。
Q5: c语言结构体函数指针怎么赋值
指针就是指向内存c语言结构体与函数指针的某个地址的一个变量。
结构体指针就是这个指针变量的值必须指向存放该结构体的内存位置。
当这个指针没有任何指向时c语言结构体与函数指针,可以赋值为null值c语言结构体与函数指针,但是改指针不可使用,程序中应该做判断。下面是一些赋值演示。
struct student{
int id;
int score;
} aaa;
struct student *p = null;//结构体指针p初始化赋值为null
struct student *p2=aaa;//p2指向aaa
struct student *p3=(struct student *)malloc(sizeof(struct student));//内存中申请一个结构体空间,并将地址强制转换为结构体指针变量赋值给p3
c语言结构体与函数指针的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于c语言结构体和指针、c语言结构体与函数指针的信息别忘了在本站进行查找喔。







