
没有直接的办法,只能给那个函数传个参数
struct Cat {
int id;
void (voice)(struct Cat c)
};
void cat_voice(struct Cat c) {
printf("miaomiao, i am cat %d\n", c->id);
}
int main() {
struct Cat cat;
catvoice = cat_voice;
catvoice(&cat);
return 0;
}
不明白你的意思,你想问的问题是:
(1)如何声明一个返回结构体指针的函数?
(2)如何声明一个带有结构体指针参数的函数?
如果是(1),则看如下代码:
struct A{
A():m1(0),m2(0){}
int m1;
int m2;
}
A Func(void){
static A a; // 静态局部变量
return &a; // 返回其指针地址
}
如果是(2)则:
void Func(A pA){
pA->m1 = 1;
pA->m2 = 2;
}
// 测试代码
A a; //am1 = 0, am2 = 0
Func(&a); //Func函数对a中的成员进行了修改 am1 = 1, am2=2
所谓函数类型是指函数返回值的类型。在C语言中允许一个函数的返回值是一个指针(即地址),这种返回指针值的函数称为指针型函数。
定义指针型函数的一般形式为:
类型说明符 函数名(形参表)
{
…… /函数体/
}
其中函数名之前加了“”号表明这是一个指针型函数,即返回值是一个指针。类型说明符表示了返回的指针值所指向的数据类型。
如:
int ap(int x,int y)
{
/函数体/
}
表示ap是一个返回指针值的指针型函数,它返回的指针指向一个整型变量。
例本程序是通过指针函数,输入一个1~7之间的整数,输出对应的星期名。
main(){
int i;
char day_name(int n);
printf("input Day No:\n");
scanf("%d",&i);
if(i<0) exit(1);
printf("Day No:%2d-->%s\n",i,day_name(i));
}
char day_name(int n){
static char name[]={ "Illegal day",
"Monday",
"Tuesday",
"Wednesday",
"Thursday",
"Friday",
"Saturday",
"Sunday"};
return((n<1||n>7) name[0] : name[n]);
}
本例中定义了一个指针型函数day_name,它的返回值指向一个字符串。该函数中定义了一个静态指针数组name。name数组初始化赋值为八个字符串,分别表示各个星期名及出错提示。形参n表示与星期名所对应的整数。在主函数中,把输入的整数i作为实参,在printf语句中调用day_name函数并把i值传送给形参n。day_name函数中的return语句包含一个条件表达式,n值若大于7或小于1则把name[0]指针返回主函数输出出错提示字符串“Illegal day”。否则返回主函数输出对应的星期名。主函数中的第7行是个条件语句,其语义是,如输入为负数(i<0)则中止程序运行退出程序。exit是一个库函数,exit(1)表示发生错误后退出程序,exit(0)表示正常退出。
应该特别注意的是函数指针变量和指针型函数这两者在写法和意义上的区别。如int(p)()和int p()是两个完全不同的量。
int (p)()是一个变量说明,说明p是一个指向函数入口的指针变量,该函数的返回值是整型量,(p)的两边的括号不能少。
int p()则不是变量说明而是函数说明,说明p是一个指针型函数,其返回值是一个指向整型量的指针,p两边没有括号。作为函数说明,在括号内最好写入形式参数,这样便于与变量说明区别。
对于指针型函数定义,int p()只是函数头部分,一般还应该有函数体部分。
在ANSI C标准中允许用结构变量作函数参数进行整体传送。但是这种传送要将全部成员逐个传送,特别是成员为数组时将会使传送的时间和空间开销很大,严重地降低了程序的效率。因此最好的办法就是使用指针,即用指针变量作函数参数进行传送。这时由实参传向形参的只是地址,从而减少了时间和空间的开销。
例计算一组学生的平均成绩和不及格人数。用结构指针变量作函数参数编程。
struct stu
{
int num;
char name;
char sex;
float score;}boy[5]={
{101,"Li ping",'M',45},
{102,"Zhang ping",'M',625},
{103,"He fang",'F',925},
{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;i<5;i++,ps++)
{
s+=ps->score;
if(ps->score<60) c+=1;
}
printf("s=%f\n",s);
ave=s/5;
printf("average=%f\ncount=%d\n",ave,c);
}
本程序中定义了函数ave,其形参为结构指针变量ps。boy被定义为外部结构数组,因此在整个源程序中有效。在main函数中定义说明了结构指针变量ps,并把boy的首地址赋予它,使ps指向boy数组。然后以ps作实参调用函数ave。在函数ave中完成计算平均成绩和统计不及格人数的工作并输出结果。
由于本程序全部采用指针变量作运算和处理,故速度更快,程序效率更高。
struct ceshi
{
int data;
};
void chage(struct ceshi p);
void main()
{
struct ceshi shuju;
shuju=(struct ceshi )malloc(sizeof(struct ceshi));//要给结构体数据开辟一个存储空间
shuju->data = 12;
chage(shuju);
printf("%d\n", shuju->data);
system("pause");
}
void chage(struct ceshi p)
{
p->data = 1000;//这里是指针变量传递进来,不是它自己的地址传递进来
}
//这样就OK了
在函数中给结构体指针数组赋值,分两种情况了,第一,若你已经有结构体对象,只是要将指针指向已经分配内存的结构体,可以用取地址的&来给指针赋值;第二,若你只定义了结构体指针,可用malloc给指针初始化,如:已经有struct
student结构体,定义student
p;给p初始化则用
p=(student)malloc(sizeof(student))。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)