精华内容
下载资源
问答
  • 结构体和指针,C语言的灵魂。面向对象我就不班门弄斧解释了。首先,一个结构体:struct Person{char* name;int age;int height;int weight;}那么“造人”吧:struct Person* Create_person(const char* name,int age...

    结构体和指针,C语言的灵魂。面向对象我就不班门弄斧解释了。

    首先,一个结构体:

    struct Person

    {

    char* name;

    int age;

    int height;

    int weight;

    }

    那么“造人”吧:

    struct Person* Create_person(const char* name,int age,int height,int weight)

    {

    struct Person* who = malloc(sizeof(struct Person));

    who->name=name;

    who->age=age;

    who->height=height;

    who->weight=weight;

    return who;

    }

    怎么“杀人”呢?

    void Destroy_person(struct Person* who)

    {

    free(who->name); // be carefull

    free(who);

    }

    输出“人”的信息:

    void Print_person(struct person* who)

    {

    printf("Name:%s",who->name);

    printf("Age:%d",who->age);

    printf("height:%d",who->height);

    printf("weight:%d",who->weight);

    }

    最后测试一下:

    int main(int argc, char *argv[])

    {

    // make two people structures

    struct Person *joe = Person_create(

    "Joe Alex", 32, 64, 140);

    struct Person *frank = Person_create(

    "Frank Blank", 20, 72, 180);

    // print them out and where they are in memory

    printf("Joe is at memory location %p:\n", joe);

    Person_print(joe);

    printf("Frank is at memory location %p:\n", frank);

    Person_print(frank);

    // make everyone age 20 years and print them again

    joe->age += 20;

    joe->height -= 2;

    joe->weight += 40;

    Person_print(joe);

    frank->age += 20;

    frank->weight += 20;

    Person_print(frank);

    // destroy them both so we clean up

    Person_destroy(joe);

    Person_destroy(frank);

    return 0;

    }

    展开全文
  • C++:计算结构体和对象的大小

    热门讨论 2021-05-02 18:00:46
    C++:计算结构体和对象的大小如何计算结构体的大小结构体的内存对齐为什么存在内存对齐如何计算一个对象的大小 如何计算结构体的大小 其实计算一个结构的大小的方法并不难,简单来说就是把结构体内的所有成员的大小...

    如何计算结构体的大小

    其实计算一个结构的大小的方法并不难,简单来说就是把结构体内的所有成员的大小相加就可以。但是,需要内存对齐那么究竟什么是内存对齐,又为什么要进行类型对齐呢?

    结构体的内存对齐

    结构体内存对齐主要有两个步骤:

    1.结构体各成员对齐.
    2.结构体总体对齐

    结构体内存对齐规则:

    1.结构体的第一个成员在存放在结构体偏移量为0的位置
    2.其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。.

    对齐数 = 编译器默认的一个对齐数与该成员大小的较小值。
    /*
    **VS中默认的值为8
    **Linux中的默认值为4
    */
    
    1. 结构体总大小为最大对齐数(每个成员变量都有一个对齐数)的整数倍。
    2. 如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。

    说了这么多,我们直接在VS环境下举几个例子给大家说明一下:
    例1:

    struct S1
    {
     char c1;
     int i;
     char c2;
    };
    

    (1)计算这个结构体的大小的时候,首先看c1的大小是1(char类型),也即是说在结构体中c1存放的位置是结构体偏移量是0的位置
    (2)接下来看i占4个字节,根据结构体对齐规则可知,c的有效对齐值为4(4 < 8)对齐到4的整数倍地址,即地址偏移量为4处.(40的位置存放了c1,所以只能从41的位置开始存放)
    (3)同(2)得出c2的存储位置是8
    (4)此时内存中共有9个字节,进行结构体整体对齐,最大对齐数是4,即要求是4的整数倍,也就是12

    在这里插入图片描述
    例2:

    struct S1
    {
    	char c1;
    	int i;
    	char c2;
    };
    struct S2
    {
    	char a1;
    	struct S1 s1;
    	int i;
    };
    

    上面我们知道S1的大小是12,现在我们计算一下S2的大小:
    (1)a1占一个字节,放在结构体变量偏移量为0 的地址处.
    (2) s1占12个字节,对齐数位4(嵌套的结构体对齐到自己的最大对齐数的整数倍处,S1的最大对齐数是4),40处存放了a1,所以只能从41处开始存放
    (3)i占了4字节,对齐数为4,s1一直存放到了15的位置,所以i只能从4*5 = 20的位置开始存储
    (4)现在内存中共有20个字节,成员中最大对齐数是4,整体对齐时为4的倍数,所以结果是20
    在这里插入图片描述
    注意:默认对齐参数是可以用#pragma pack()设置的,例如下面的这个例子

    #include <stdio.h>
    #include <Windows.h>
    #pragma pack(8)//设置默认对齐数为8
    struct S1
    {
    	char c1;
    	int i;
    	char c2;
    };
    #pragma pack()//取消设置的默认对齐数,还原为默认
    #pragma pack(1)//设置默认对齐数为1
    struct S2
    {
    	char c1;
    	int i;
    	char c2;
    };
    #pragma pack()//取消设置的默认对齐数,还原为默认
    int main()
    {
    	//输出的结果是什么?
    	printf("%d\n", sizeof(struct S1));
    	printf("%d\n", sizeof(struct S2));
    	system("pause");
    	return 0;
    }
    

    在这里插入图片描述

    为什么存在内存对齐

    1.平台原因(移植原因): 不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。
    2. 性能原因: 数据结构(尤其是栈)应该尽可能地在自然边界上对齐。 原因在于,为了访问未对齐的内存,处理器
    需要作两次内存访问;而对齐的内存访问仅需要一次访问

    如何计算一个对象的大小

    其实在C++中,结构体和类可以认为是相同的,只是默认的访问权限不同(struct默认是public,class默认是private ),从这方面来看的话,其实计算一个类/对象的大小的方法和计算结构体的大小的方法是一样的。
    我们来验证一下:

    #include <iostream>
    using namespace std;
    
    struct A
    {
    	int a;
    	char b;
    	char c;
    };
    class B
    {
    	int a;
    	char b;
    	char c;
    };
    
    int main()
    {
    	cout << sizeof(A) << endl;
    	cout << sizeof(B) << endl;
    	system("pause");
    	return 0;
    }
    

    在这里插入图片描述

    可以看到,我们对结构体A和类B计算大小是一样的。

    展开全文
  • C++C#在结构体和对象的细微区别

    //=====================================================================
    //TITLE:
    //    C++ VS C#(11):结构体和对象的细微区别
    //AUTHOR:
    //    norains
    //DATE:
    //    Friday  18-January-2011
    //Environment:
    //    Visual Studio 2010
    //    Visual Studio 2005
    //=====================================================================

     

    1. 结构体和对象的细微区别

     

      struct(结构体)是C遗留下来的玩意,既然C++和C#都和C有着那么不一般的关系,自然也继承了这个血统。既然又打着面向对象的旗号,自然也有所创新,也就有了class(类),而类的实例化又有了对象。
      
       那么struct和class是不是两样不同的东西呢?答案不能简单说是或否,因为其实这两者关系还蛮大的。在C++中,struct和class其实就是一个玩意,唯一不同的是,成员如果没有访问修饰符的时候,struct默认的是public,class的则是private!如果以代码的方式,可能大家更容易明白,如下所示:
     

       而访问修饰符在struct和class的差异在C#中根本就不存在,因为在C#中无论是struct还是class,访问修饰符默认的都是private。
      
      
       C++中struct和class还有个区别是,struct支持初始化列表,而class不支持,如下代码所示:
     
       
       直接给对象进行初始化列表赋值的话,那么编译器会报错:error C2552: 'myClass' : non-aggregates cannot be initialized with initializer list。
      
      
       说了那么多C++的区别,但这没有一个是对应上C#的,那是不是可以断言,C#的struct等同于class?当然不是。在C#中,struct是值类型,而class是引用类型。而这个类型的不同,直接影响到"="赋值操作符。我们来看一段具体的代码:

     


       该段代码的输出结果如下:
       myStruct1.Value = 10
       myStruct2.Value = 20
       myClass1.Value = 20
       myClass2.Value = 20

      
       从结果中可以看出,类的"="就相当于指针赋值,MyClass myClass2 = myClass1语句完全可以认为是将myClass1的地址赋值给myClass2,所以对myClass2的任何更改都会反映到myClass1之中。而struct的"="操作,就是简单的赋值操作,也就是将myStruct1.Value复制给myStruct2.Value而已,对myStruct2的任何操作都不会影响到myStruct1。
      
       struct和class的"="的区别,在C++中根本不存在。无论是struct还是class,C++中的"="都是赋值操作,也就是和C#的struct一致。

    展开全文
  • 1 结构体 1.1 结构体定义 typedef struct { int year; int month; int day; }Date; 1.2 结构体的赋值 // 需要设置为公用属性 stu->_name = @"xgd"; // 需要对其进行类型转换,否则计算机不清楚后面的是数组...

    1 结构体

    • 1.1 结构体定义
    typedef struct {
        int year;
        int month;
        int day;
    }Date;

    • 1.2 结构体的赋值
        // 需要设置为公用属性
        stu->_name = @"xgd"; 
         // 需要对其进行类型转换,否则计算机不清楚后面的是数组还是结构体(本质就是将一个结构体赋值给另一个结构体)
        stu->_birthday = (Date){1999, 1 ,15};
        // 对单一属性进行赋值
        stu->_birthday.year = 1999;

    2 对象

    • 2.1 对象的定义
    @interface Student : NSObject
    {
        @public // 设置为公用属性,以便对其进行相关操作
        NSString *_name;
        Date _birthday;
    }
    @end

    • 2.2 对象的创建
        Student *stu = [Student new];
        Student *student = [[Student alloc]init];
        new和alloc/init在功能上几乎是一致的,分配内存并完成初始化。
    区别:
        1.new的方式只能采用默认的init方法完成初始化,采用alloc的方式可以用其他定制的初始化方法。
        2.alloc分配内存的时候使用了zone,zone它是给对象分配内存的时候,把关联的对象分配到一个相邻的内存区域内,以便于调用时消耗很少的代价,提升了程序处理速度。
    

    • 2.2 对象的方法
    @implementation Student
    - (void)say{
        NSLog(@"name = %@, year = %i, month = %i, day = %i", _name, _birthday.year, _birthday.month, _birthday.day);
    }
    @end
    展开全文
  • golang结构体-对象和指针-函数赋予

    千次阅读 2019-05-21 10:30:18
    转载地址:https://studygolang.com/articles/14244 原作者:amu_lucifer 1、定义一个结构体 typeUserstruct{ useridint ...2、初始化一个结构体 ... 有两种情况,一是得到结构体对象,一是得到结构的对象指针...
  • 结构体对象

    千次阅读 2018-08-23 11:45:16
    结构体对象里面我们把值附上,这样就完成了一个结构体的对象。   如果我们要用到哪个结构体,我们就选择哪个,怎么选择呢,当然是使用他唯一而且不变的一个参数,name,ID等待。 把可以先把结构体的对象存到...
  • 结构体对象的联系与区别 1.结构体是一种值类型,而类是引用类型。值类型用于存储数据的值,引用类型用于存储对实际数据的引用。 那么结构体就是当成值来使用的,类则通过引用来对实际数据操作。 2.结构使用栈...
  • OC 结构体作为对象的属性

    千次阅读 2017-01-12 16:10:24
    // 结构体作为对象的属性 #import /*  事物:学生  属性:姓名 生日  行为:可以说出自己姓名生日  */ typedef struct{  int year;  int month;  int day; } Date; ...
  • 结构体作为对象的属性

    千次阅读 2016-01-21 00:15:06
    结构体作为对象的属性: 结构体如何开辟存储空间  结构体分配存储空间是将所有属性占用的存储空间的总和加在一起后再分配  注意:   其实结构体分配存储空间本质上并不是将所有属性占用的存储空间的总和加在...
  • #import &amp;lt;Foundation/Foundation....// typedef 给结构体添加别名 typedef struct { int year; int month; int day; } Date; // 定义Student类 @interface Student : NSObject { @public NSString ...
  • c++结构体对象排序

    2018-11-23 19:08:24
    c++中的结构体定义 然后是使用实例: 编写程序,从键盘输入 n (n&amp;amp;lt;10)个学生的学号(学号为4位的整数,从1000开始)、成绩并存入结构数组中,按成绩从低到高排序并输出排序后的学生信息。 ...
  • 面向对象结构体和类的区别 1.结构体是一种值类型,而类是引用类型。值类型用于存储数据的值,引用类型用于存储对实际数据的引用。 那么结构体就是当成值来使用的,类则通过引用来对实际数据操作。 2.结构...
  • Matlab结构体内容引用自非结构体数组对象matlab的gui报错axes(handles.axes1)如何解决起因代码 matlab的gui报错axes(handles.axes1) 废话不多说,直接上bug 如何解决 特别简单,我们运行GUI的.m文件,而不是双击...
  • 结构体和区别

    万次阅读 2011-09-16 10:51:19
    结构体和类都是提供了数据的封装构造  结构体主要是c语言的特色  类是c++的基本机制  结构体中的数据默认方式是public的,而类是private的  结构体不提供继承机制,类提供继承机制,实现代码复用  类...
  • //结构体 //一种数据类型,其地位等价于int string bool... //通常全局定义 //可以使用== !=进行比较 //相同类型的结构体可以相互赋值(类型,个数,顺序一致) //结构体的变量地址等于首个成员的变量地址 //定义...
  • cvx _begin quiet variable u_N(4*N) minimize ( (1/2)*quad_form(u_N,H) + d'*u_N ) u_N *ones(4*N,1); u_N >= -u_limit*ones(4*N,1); Z*u_N *x0 + x_lim_vec_full; Z*u_N >= -P*x0 - x_lim_vec_...
  • Keil4 C51工程网址: ... 一、面向对象 面向对象是软件开发方法,是相对于...单片机C语言的面向对象编程,是利用结构体,将变量、指针、函数等进行封装,达到编程更加方便、程序可读性更好、方便移植等目的。 二、知...
  • C语言的结构体和 C++结构体区别 关于C++中声明结构体中需要使用构造器创建实例对象的语法: <C++的结构体构造方法的基本概念:结构体的构造方法需要和结构体的名字相同,并且无返回值,也不要void关键字...
  • 结构体与类
  • 问题:对于结构体类型,已知结构体对象中的一个变量成员的地址值,在不创建结构体对象的前提下,如何计算其他结构体变量成员? #include "stdafx.h" #include #include #include typedef unsigned int size_t; #...
  • 结构体和类的区别

    万次阅读 多人点赞 2019-10-16 14:17:50
    结构体和类的区别: 在做一个项目时,使用了较多的结构体,并且存在一些结构体的嵌套,即某结构体成员集合包含另一个结构体等,总是出现一些奇怪的错误,才终于下决心好好分析一下到底类和结构体有啥不同,虽然它们...
  • 学习了C++的面向对象,最常见的写的就是类结构体,这篇文章主要简单介绍一下结构体和类的区别。  首先类是C++中面向对象独有的,但是CC++中都有结构体,下面我们来看一下CC++中结构体区别。这里主要从封装...
  • go 打印结构体对象,结构体指针

    万次阅读 2020-05-28 22:24:52
    简言 1. go语言提供了简洁的打印功能,比如%d, %v, %+v等等...3. 结构体指针的数组时,如果想打印出里面各个指针对象的各个变量时,需要为结构体定义一个String()的函数,也就是自定义 实验如下图(第一行输出是一...
  • 基于对象思想的结构体运用对于c语言来说好像没有对象这个概率,但是结构体的出现可以完全模拟对象情况举个简单的例子,就好像c++教程里关于求矩形的面积的问题,先定义一个对象类。class 矩形 { ... public: .....

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 185,500
精华内容 74,200
关键字:

结构体和对象的区别