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語言結構體的函數指針會不會亂指
指針聲明就已經確定他可以指向哪一種類型的變數了,比如整形指針……,函數指針只能指向它聲明時參數類型返回值類型相同的函數,否則會和用整型指針指向浮點型數據一樣不能通過