精华内容
下载资源
问答
  • C语言结构体中如何包含函数

    万次阅读 多人点赞 2018-08-09 10:42:28
    C语言结构体中如何包含函数 C语言结构体里面也可以包含函数,如同类中有方法一样,但是不能通过直接放过一个函数进去,需要通过函数指针的方式,同时,关于类的构造函数与析构函数C语言表示是没有的,需要你自己...

                                      C语言结构体中如何包含函数

    C语言结构体里面也可以包含函数,如同类中有方法一样,但是不能通过直接放过一个函数进去,需要通过函数指针的方式,同时,关于类的构造函数与析构函数C语言表示是没有的,需要你自己手动解决这些问题。
    下面讲讲如何在C语言中的结构体包含函数。如下的一段代码:

    #include<iostream>
    #include<string>
    using namespace std;
    class Hello{
    public:
    	void sayHello(string name){
    		cout<<"你好,"<<name<<endl;
    	}
    };
    int main(){
    	Hello* hello=new Hello();
    	hello->sayHello("a");
    	return 0;
    }
    

    简单的不想再解释,就是C++关于方法的Helloworld实力代码。运行结果如下图所示:

    如果需要用纯C实现上面的东西,也就是在一个Hello的结构体里面包含一个函数,你可以写成这样:

    #include<stdio.h>
    #include<malloc.h>
    struct Hello{
    	void (*sayHello)(char* name); 
    };
    void sayHello(char* name){
    	printf("你好,%s\n",name);
    }
    int main(){
    	struct Hello* hello=(struct Hello *)malloc(sizeof(struct Hello));
    	hello->sayHello=sayHello;//这个结构体有多少个函数,就要在这个有多少个结构体内,函数指针指向函数的声明。
    	hello->sayHello("a");
    	return 0;
    }
    

    运行结果和上面一模一样的,但是你要注意,本来已经比较坑爹的C++变成C语言来表达,就变得更加坑,每用这个包含函数指针的结构体,一定要声明这结构体内的指针一次。就是这么坑爹。

    事实上,结构体这种写法,和C++中的这种类外函数声明写法是很类似的:

    #include<iostream>
    #include<string>
    using namespace std;
    class Hello{
    public:
    	void sayHello(string name);
    };
    void Hello::sayHello(string name){
    	cout<<"你好,"<<name<<endl;
    }
    int main(){
    	Hello* hello=new Hello();
    	hello->sayHello("a");
    	return 0;
    }
    

    以上三个代码,运行结果自然是一样的,只是表达不同而已。

    展开全文
  • 那么,我们在C语言结构体中,只能通过定义函数指针的方式,用函数指针指向相应函数,以此达到调用函数的目的。 函数指针 函数类型 (*指针变量名)(形参列表);第一个括号一定不能少。 “函数类型”说明函数的返回...
  • C语言结构体中的函数指针 结构体是由一系列具有相同类型或不同类型的数据构成的数据集合。所以,标准C中的结构体是不允许包含成员函数的,当然C++中的结构体对此进行了扩展。那么,我们在C语言的结构体中,只能...

    C语言结构体中的函数指针

    结构体是由一系列具有相同类型或不同类型的数据构成的数据集合。所以标准C中的结构体是不允许包含成员函数的,当然C++中的结构体对此进行了扩展。那么,我们在C语言的结构体中,只能通过定义函数指针的方式,用函数指针指向相应函数,以此达到调用函数的目的。

    1. 函数指针

    一般的函数指针可以这么定义:

    int(*func)(int,int);

    表示一个指向含有两个int参数并且返回值是int形式的任何一个函数指针. 假如存在这样的一个函数:

    int add2(int x,int y)

    {

    return x+y;

    }

    那么在实际使用指针func时可以这样实现:

    func=&add2; //指针赋值,或者func=add2; add2与&add2意义相同

    printf("func(3,4)=%d"n",func(3,4));

    事实上,为了代码的移植考虑,一般使用typedef定义函数指针类型.

    typedef int(*FUN)(int,int);

    FUN func=&add2;

    func();

    2.结构体中包含函数指针

    其实在结构体中,也可以像一般变量一样,包含函数指针变量.下面是一种简单的实现.

    #include "stdio.h"

    struct DEMO

    {

    int x,y;

    int (*func)(int,int); //函数指针

    };

    int add2(int x,int y)

    {

    return x+y;

    }

    void main()

    {

    struct DEMO demo;

    demo.func=&add2; //结构体函数指针赋值

    printf("func(3,4)=%d"n",demo.func(3,4));

    }
    展开全文
  • C语言结构体

    2019-11-02 22:32:05
    C语言结构体解析 在C语言,可以使用结构体(Struct)来存放一组不同类型的数据。结构体的定义形式为: struct 结构体名{ 结构体所包含的变量或数组 }; 结构体是一种集合,它里面包含了多个变量或数组,它们的...

    C语言结构体解析


    在C语言中,可以使用结构体(Struct)来存放一组不同类型的数据。结构体的定义形式为:

    struct 结构体名{
        结构体所包含的变量或数组
    };
    

    结构体是一种集合,它里面包含了多个变量或数组,它们的类型可以相同,也可以不同,每个这样的变量或数组都称为结构体的成员(Member)。

    struct stu{
        char *name;  //姓名
        int num;  //学号
        int age;  //年龄
        char group;  //所在学习小组
        float score;  //成绩
    };
    

    stu 为结构体名,它包含了 5 个成员,分别是 name、num、age、group、score。结构体成员的定义方式与变量和数组的定义方式相同,只是不能初始化。

    注意大括号后面的分号;不能少,这是一条完整的语句。

    既然结构体是一种数据类型,那么就可以用它来定义变量。
    例如:

    struct stu stu1, stu2;//stu为结构体名
    

    注意带着结构体名

    stu 就像一个“模板”,定义出来的变量都具有相同的性质。也可以将结构体比作“图纸”,将结构体变量比作“零件”,根据同一张图纸生产出来的零件的特性都是一样的。

    亦可以在定义结构体同时定义结构体变量,将变量放在结构体定义的最后即可。

    struct stu{
        char *name;  //姓名
        int num;  //学号
        int age;  //年龄
        char group;  //所在学习小组
        float score;  //成绩
    } stu1, stu2;
    

    给结构体成员赋值

        stu1.name = "Tom";
        stu1.num = 12;
        stu1.age = 18;
        stu1.group = 'A';
        stu1.score = 136.5;
    

    除了可以对成员进行逐一赋值,也可以在定义时整体赋值,例如:

    struct{
        char *name;  //姓名
        int num;  //学号
        int age;  //年龄
        char group;  //所在小组
        float score;  //成绩
    } stu1, stu2 = { "Tom", 12, 18, 'A', 136.5 };
    

    需要注意的是,结构体是一种自定义的数据类型,是创建变量的模板,不占用内存空间;结构体变量才包含了实实在在的数据,需要内存空间来存储。

    所谓结构体数组,是指数组中的每个元素都是一个结构体。在实际应用中,C语言结构体数组常被用来表示一个拥有相同数据结构的群体,比如一个班的学生、一个车间的职工等。

    struct stu{
        char *name;  //姓名
        int num;  //学号
        int age;  //年龄
        char group;  //所在小组 
        float score;  //成绩
    }class[5];
    
    struct stu{
        char *name;  //姓名
        int num;  //学号
        int age;  //年龄
        char group;  //所在小组 
        float score;  //成绩
    }class[] = {
        {"Li ping", 5, 18, 'C', 145.0},
        {"Zhang ping", 4, 19, 'A', 130.5},
        {"He fang", 1, 18, 'A', 148.5},
        {"Cheng ling", 2, 17, 'F', 139.0},
        {"Wang ming", 3, 17, 'B', 144.5}
    };
    

    结构体数组的使用也很简单,例如,获取 Wang ming 的成绩:

    class[4].score;
    

    当一个指针变量指向结构体时,我们就称它为结构体指针。C语言结构体指针的定义形式一般为:

    struct 结构体名 *变量名;
    

    例子:

    //结构体
    struct stu{
        char *name;  //姓名
        int num;  //学号
        int age;  //年龄
        char group;  //所在小组
        float score;  //成绩
    } stu1 = { "Tom", 12, 18, 'A', 136.5 };
    //结构体指针
    struct stu *pstu = &stu1;
    

    注意,结构体变量名和数组名不同,数组名在表达式中会被转换为数组指针,而结构体变量名不会,无论在任何表达式中它表示的都是整个集合本身,要想取得结构体变量的地址,必须在前面加&,所以给 pstu 赋值只能写作:

    struct stu *pstu = &stu1;
    

    还应该注意,结构体和结构体变量是两个不同的概念:结构体是一种数据类型,是一种创建变量的模板,编译器不会为它分配内存空间,就像 int、float、char 这些关键字本身不占用内存一样;结构体变量才包含实实在在的数据,才需要内存来存储。下面的写法是错误的,不可能去取一个结构体名的地址,也不能将它赋值给其他变量:

    struct stu *pstu = &stu;
    struct stu *pstu = stu;
    

    通过结构体指针可以获取结构体成员,一般形式为:

    (*pointer).memberName
    

    或者:

    pointer->memberName
    

    第一种写法中,.的优先级高于*,(pointer)两边的括号不能少。如果去掉括号写作pointer.memberName,那么就等效于*(pointer.memberName),这样意义就完全不对了。

    第二种写法中,->是一个新的运算符,习惯称它为“箭头”,有了它,可以通过结构体指针直接取得结构体成员;这也是->在C语言中的唯一用途。

    上面的两种写法是等效的,我们通常采用后面的写法,这样更加直观。

    #include <stdio.h>
    struct stu{
        char *name;  //姓名
        int num;  //学号
        int age;  //年龄
        char group;  //所在小组
        float score;  //成绩
    }stus[] = {
        {"Zhou ping", 5, 18, 'C', 145.0},
        {"Zhang ping", 4, 19, 'A', 130.5},
        {"Liu fang", 1, 18, 'A', 148.5},
        {"Cheng ling", 2, 17, 'F', 139.0},
        {"Wang ming", 3, 17, 'B', 144.5}
    }, *ps;
    int main(){
        //求数组长度
        int len = sizeof(stus) / sizeof(struct stu);
        printf("Name\t\tNum\tAge\tGroup\tScore\t\n");
        for(ps=stus; ps<stus+len; ps++){
            printf("%s\t%d\t%d\t%c\t%.1f\n", ps->name, ps->num, ps->age, ps->group, ps->score);
        }
        return 0;
    }
    

    结构体变量名代表的是整个集合本身,作为函数参数时传递的整个集合,也就是所有成员,而不是像数组一样被编译器转换成一个指针。如果结构体成员较多,尤其是成员为数组时,传送的时间和空间开销会很大,影响程序的运行效率。所以最好的办法就是使用结构体指针,这时由实参传向形参的只是一个地址,非常快速。

    #include <stdio.h>
    struct stu{
        char *name;  //姓名
        int num;  //学号
        int age;  //年龄
        char group;  //所在小组
        float score;  //成绩
    }stus[] = {
        {"Li ping", 5, 18, 'C', 145.0},
        {"Zhang ping", 4, 19, 'A', 130.5},
        {"He fang", 1, 18, 'A', 148.5},
        {"Cheng ling", 2, 17, 'F', 139.0},
        {"Wang ming", 3, 17, 'B', 144.5}
    };
    void average(struct stu *ps, int len);
    int main(){
        int len = sizeof(stus) / sizeof(struct stu);
        average(stus, len);
        return 0;
    }
    void average(struct stu *ps, int len){
        int i, num_140 = 0;
        float average, sum = 0;
        for(i=0; i<len; i++){
            sum += (ps + i) -> score;
            if((ps + i)->score < 140) num_140++;
        }
        printf("sum=%.2f\naverage=%.2f\nnum_140=%d\n", sum, sum/5, num_140);
    }
    

    摘自:C语言中文网

    展开全文
  • 最近在接触c语言项目,使用VLD查看内存泄漏,就一直在纠结结构体中如果定义了指针变量,在外面使用malloc为其分配了空间,那仅仅释放结构体指针可以吗?会存在内存泄漏吗?因此做了个小实验,前面话...结构体中包含

    最近在接触c语言项目,使用VLD查看内存泄漏,就一直在纠结结构体中如果定义了指针变量,在外面使用malloc为其分配了空间,那仅仅释放结构体指针可以吗?会存在内存泄漏吗?因此做了个小实验,前面话比较绕,描述可能有问题,那么直接上代码:
    首先定义结构体:

    #include<vld.h>
    #include<stdio.h>
    #include<stdlib.h>
    
    struct Test
    {
    	unsigned char* ucTest;
    	int a;
    };
    

    结构体中包含了一个uchar指针(后面为其分配内存空间,问题的核心也在这里:需不需要单独释放后面为其分配的内存呢?)和int变量。
    首先不单独释放,测试代码如下:

    void test()
    {
    	Test* test = NULL;
    	test = (Test*)malloc(sizeof(Test) * 4);
    
    	for (int i = 0; i < 4; i++)
    	{
    		test[i].ucTest = (unsigned char*)malloc(10);
    		test[i].a = i;
    	}
    
    	//for (int i = 0; i < 4; i++) //单独释放结构体中数组的内存。
    	//{
    	//	free(test[i].ucTest);
    	//	test[i].ucTest = NULL;
    	//}
    
    	free(test);//释放结构体数组
    	test = NULL;
    	
    }
    

    运行程序,发现VLD提示内存泄漏,结果如下所示:

    Visual Leak Detector detected 4 memory leaks (184 bytes).
    Largest number used: 252 bytes.
    Total allocations: 252 bytes.
    Visual Leak Detector is now exiting.
    The program '[4820] test.exe' has exited with code 0 (0x0).
    

    查找内存泄漏的地方,定位到

    test[i].ucTest = (unsigned char*)malloc(10);
    

    从而猜想可能需要单独释放内存,因而取消掉单独释放内存的注释,继续运行程序:

    No memory leaks detected.
    Visual Leak Detector is now exiting.
    

    提示无内存泄漏。说明还是需要单独释放内存的

    PS: C语言这个语言真的细节很多,之前写代码都是实现功能就行,对于细节把握不足,后面这个方面还是需要改进。自己算是C语言小白,如果有问题希望大家能够指出。

    展开全文
  • 结构体(struct)指的是一种数据结构,是C语言中聚合数据类型(aggregate data type)的一类。个人认为是C语言实现面向对象编程非常重要的数据类型之一结构体的使用分为定义、引用、初始化,之后还有结构体数组、结构体...
  • C语言 结构体结构体指针用法总结

    万次阅读 多人点赞 2017-08-20 17:03:18
    C语言开发结构体用到的机会很多。所谓结构体,就是定义一种里面包含多种元素的变量。 我们来看一个简单的例子。比如你想定义一个书名列表然后为每本书创建书名和作者作为书的信息。结构体变量定义如下: ...
  • C语言中,可以使用结构体(Struct)来存放一组不同类型的数据。结构体的定义形式为:struct 结构体名{结构体包含的变量或数组};结构体是一种集合,它里面包含了多个变量或数组,它们的类型可以相同,也可以不同,...
  • 在C++中除了类中可以有构造函数和析构函数外,结构体中也可以包含构造函数和析构函数,这是因为结构体和类基本雷同,唯一区别是,类中成员变量默认为私有,而结构体中则为公有。注意,C++中的结构体是可以有析构函数...
  • C语言结构体(Struct)

    千次阅读 多人点赞 2018-10-18 18:11:39
    C语言结构体(Struct) 在C语言,可以使用结构体(Struct)来存放一组不同类型的数据。结构体的定义形式为: struct 结构体名{  结构体所包含的变量或数组 }; 结构体是一种集合,它里面包含了多个变量或数组...
  • C语言结构体学习总结

    万次阅读 多人点赞 2018-08-13 18:04:11
    C语言中包含short、int、long、char、float、double这六中基本数据类型。当然还有构造类型、指针类型、和空类型。如图所示: 今天,我们着重总结一下构造数据类型中的结构体 (关键字:struct,不能省略) 的相关...
  • C语言结构体详解

    2020-02-27 10:15:37
    数组(Array),它是一组具有相同类型的数据的集合。但在实际的编程过程,我们往往还需要一组类型不同的数据,例如对于学生信息登记表,姓名为字符串,学号为整数,年龄为整数,... 结构体包含的变量或数组 };...
  • C语言结构体练习

    2020-06-09 12:25:45
    定义一个结构体student,存储学生的学号、名字、性别和年龄,读入每个学生的所有信息,保存在结构体中,并输出。结构体student的定义如下: struct student { int num; char name[20]; char sex; int age; }; 本题...
  • C语言结构体总结

    2019-12-19 22:54:39
    一.什么是结构体 我们知道数组,它是一组具有相同类型的数据的...在C语言中,我们可以使用结构体来存放一组不同类型的数据。 结构体是一种集合,它里面包含了多个变量或数组,它们的类型可以相同,也可以不同,每...
  • c语言结构体赋值问题

    2020-07-03 10:15:18
    一般来说,C语言中结构体变量可以用另一个变量对其进行赋值或初始化。简单结构体(不包含指针成员)直接赋值没有问题。但是稍微复杂一点的结构体里面会 有指针成员,那么以上的浅拷贝则会有问题。 1)赋值会直接将...
  • C语言结构体存储空间分配的原则 我们在嵌入式编程经常用到结构体,结构体内成员变量的声明顺序不同,会带来结构体整体存储空间大小的不同,这是因为在C语言里,结构体里元素存储要对齐,这个“对齐”里面包含了很...
  • C语言中,可以使用结构体(Struct)来存放一组不同类型的数据。结构体的定义形式为: struct 结构体名{  结构体包含的变量或数组 }; 结构体是一种集合,它里面包含了多个变量或数组,它们的类型可以相同,也...
  • 那么,我们在C语言结构体中,只能通过定义函数指针的方式,用函数指针指向相应函数,以此达到调用函数的目的。函数指针函数类型 (*指针变量名)(形参列表);第一个括号一定不能少。“函数类型”说明函数的返回类型...
  • 编写input)和output)函数输入输出5个学生的数据记录 参考答案 创建一个链表 参考答案 反向输出一个链表 参考答案 建立一个单向链表链表每个结点包含成绩和指针两个域之后输出该链表对该链表排序并输出任意输入一个...
  • C语言中,可以使用结构体(Struct)来存放一组不同类型的数据。结构体的定义形式为: struct 结构体名{ 结构体包含的变量或数组 }; 结构体是一种集合,它里面包含了多个变量或数组,它们的类型可以相同,也可以...
  • 解析C语言结构体

    2017-07-16 12:13:32
    于是在C引入了结构体。 一、定义结构体类型 在声明结构时,必须列出它包含的所有成员。这个列表包括每个成员的类型和名字。 比如下面这个声明,创建了一个叫x的变量,它包含了三个成员,一个整数、一个字符和一个...
  • C语言中,可以使用结构体(Struct)来存放一组不同类型的数据。结构体的定义形式为:: struct 结构体名{ 结构体包含的变量或数组 }; 结构体是一种集合,它里面包含了多个变量或数组,它们的类型可以相同,也...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,214
精华内容 485
关键字:

c语言结构体中包含结构体

c语言 订阅