结构体中的指针函数以及“结构体”的继承
#include <stdio.h> #include <stdlib.h> struct Fruit { void (*output)(void); int i; }; struct Apple { struct Fruit n; void (*output)(void); }; void output_base(void); void output_driven(void); void output_apple(void); int main() { struct Fruit *p; struct Apple *q; struct Fruit base; struct Apple driven; base.i = 0; base.output = output_base; driven.n.i = 1; driven.n.output = output_driven; driven.output = output_apple; p = &base; printf("base's i is %d/n",p->i); p->output(); p = (Fruit *)&driven; printf("driven's i is %d/n",p->i); q = &driven; q->output(); getchar(); return 0; } void output_base(void) { printf("this is the base/n"); } void output_driven(void) { printf("this is the driven/n"); } void output_apple() { printf("this is apple's output/n"); } ****************************************************************** 【相关帖子】结构体中指向函数的指针 结构体中指向函数的指针 C语言中的struct是最接近类的概念,但是在C语言的struct中只有成员,不能有函数,但是可以有指向函数的指针,这也就 方便了我们使用函数了。举个例子,如下: #include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct student { int id; char name[50]; void (*initial)(); void (*process)(int id, char *name); void (*destroy)(); }stu; void initial() { printf("initialization.../n"); } void process(int id, char *name) { printf("process.../n%d/t%s/n",id, name); } void destroy() { printf("destroy.../n"); } int main() { stu *stu1; //在VC和TC下都需要malloc也可以正常运行,但是linux gcc下就会出错,为段错误,必须malloc stu1=(stu *)malloc(sizeof(stu)); // 使用的时候必须要先初始化 stu1->id=1000; strcpy(stu1->name,"xufeng"); stu1->initial=initial; stu1->process=process; stu1->destroy=destroy; printf("%d/t%s/n",stu1->id,stu1->name); stu1->initial(); stu1->process(stu1->id, stu1->name); stu1->destroy(); free(stu1); return 0; } ------------------------------------ c语言中,如何在结构体中实现函数的功能?把结构体做成和类相似,让他的内部有属性,也有方法 这样的结构体一般称为协议类,提供参考: struct { int funcid; char *funcname; int (*funcint)(); /* 函数指针 int 类型*/ void (*funcvoid)(); /* 函数指针 void类型*/ }; 每次都需要初始化,比较麻烦 ****************************************************************** 【相关帖子】函数中使用结构体指针改变成员变量的值怎么不能传递到主函数中去 程序代码如下: #include <stdlib.h>#include <iostream.h> struct TNode { int data ; TNode *lchild ; TNode *rchild ; } ; void CreateTree(TNode *T , int A[] , int begin , int end) { if (begin > end) { T = NULL ; return ; } int index = 0.5 * (begin + end) ; T = (TNode*)malloc(sizeof(TNode)) ; T->data = A[index] ; CreateTree(T->lchild , A , begin , index - 1) ; CreateTree(T->rchild , A , index + 1 , end) ; } void main() { int A[10] ; for (int i = 0 ; i < 10 ; i++) { A[i] = i ; } TNode *T ; CreateTree(T , A , 0 , 9) ; cout << T->data << endl ; } 程序运行不太对,错误就出在CreateTree函数中创建的T节点的的成员变量值没有传递出去,但是CreateTree函数的形参是指向结构体的指针啊,为什么会出现这种问题呢? ---------------------------------------------------------------------- void CreateTree(TNode* &T , int A[] , int begin , int end) ---------- 改成对指针的引用... -------------------------------------------------------- 使用引用 -------------------------------------------------------- 为什么要加引用呢?T已经是指向结构体的指针了,应该可以将改变后的信息传递到主函数中啊 ------------------------------------------------------- 尽管加引用后运行结果是正确的 -------------------------------------------------------- 因为需要将指针自身传出去 如果在函数外面分配空间就不需要引用了 -------------------------------------------------------- 如果需要改变变量的值,那么就应该传变量的指针(地址), 如果需要改变指针的值,那么就应该传指针的指针(地址)。 -------------------------------------------------------- 不用引用可以用指针的指针 void CreateTree(TNode **T , int A[] , int begin , int end) { TNode* newT; if (begin > end) { T = NULL; return; } int index = 0.5 * (begin + end); newT = (TNode*)malloc(sizeof(TNode)); *T = newT; newT->data = A[index] ; CreateTree(&newT->lchild , A , begin , index - 1) ; CreateTree(&newT->rchild , A , index + 1 , end) ; } void main() { int A[10] ; for (int i = 0 ; i < 10 ; i++) { A[i] = i ; } TNode *T ; CreateTree(&T , A , 0 , 9) ; cout << T->data << endl ; } -------------------------------------------------------- 哦,我明白了,谢谢各位了,结帖 ****************************************************************************** 【相关帖子】函数给作为参数传递的结构体指针的结构体成员赋值 char func(struct compABC *ABC) 正确 { ABC->member1 = 12; ABC->member2 = 34; } char func(struct compABC *ABC) 错误,根据 K&R C 相关章节的说明,-> 运算符也比 * 优先 { *ABC->member1 = 12; *ABC->member2 = 34; } char func(struct compABC *ABC) 错误,点号(.)比星号(*)优先 { *ABC.member1 = 12; *ABC.member2 = 34; } char func(struct compABC *ABC) 正确 { (*ABC).member1 = 12; (*ABC).member2 = 34; } 附:什么是 K&R C C语言由Dennis M. Ritchie在1973年设计和实现。从那以后使用者逐渐增加。到1978年Ritchie和Bell实验室的另一位程序专家Kernighan合写了著名的《The C Programming Language》,将C语言推向全世界,许多国家都出了译本,国内有一些C语言书就是这本书的翻译或者编译。由这本书定义的C语言后来被人们称作 K&R C。 随着C语言使用得越来越广泛,出现了许多新问题,人们日益强烈地要求对C语言进行标准化。这个标准化的工作在美国国家标准局(ANSI)的框架中进行(1983-1988),最终结果是1988年10月颁布的ANSI标准X3.159-1989,也就是后来人们所说的ANSI C标准。由这个标准定义的C语言被称作ANSI C。 ANSI C标准很快被采纳为国际标准和各国的标准。国际标准为ISO/IEC 9899-1990,中国国家标准GB/T 15272-94是国际ISO标准的中文翻译。 ANSI C标准化工作的一个主要目标是清除原来C语言中的不安全、不合理、不精确、不完善的东西。由此也产生了ANSI C与K&R C之间的差异。从总体上看,这些差异反应的是C语言走向完善、走向成熟。
ANSI C 对 K&R C 的修订 (本段根据《C Programming Language》和C语言标准整理。不求完整,希望列出最常见的差异)
|
结构体中的指针函数以及“结构体”的继承
最新推荐文章于 2024-09-18 09:44:41 发布