结构体类型

sizeof和sizeof(string)的问题

╄→尐↘猪︶ㄣ 提交于 2019-11-27 13:50:01
今天看《程序员面试宝典》一书(为了应付将要到来的微软笔试),看到了sizeof(string)这个问题。在Dev C++上测试的结果是4,很不明白。上网搜了一下,得到如下结果: string strArr1[]={"Trend", "Micro", "Soft"}; sizeof(strArr1)=12 转自: http://apps.hi.baidu.com/share/detail/30398570 关于sizeof(string),今天看那本面试宝典的时候看到这个表达式,有点吃惊,书上写着sizeof(string)=4;当时很纳闷,难道分配4个字节大小的内存给string吗?查阅了相关资料得出结论: string的实现在各库中可能有所不同,但是在同一库中相同一点是,无论你的string里放多长的字符串,它的sizeof()都是固定的,字符串所占的空间是从堆中动态分配的,与sizeof()无关。 sizeof(string)=4可能是最典型的实现之一,不过也有sizeof()为12、32字节的库实现。 但是VC6.0测试后sizeof(string)=16.还是跟编译器有关 #include<iostream> using namespace std; void main(void) { string a[] = {"aaaaa","bbbb","ccc"}; int x =

ZYNQ——C语言基础知识复习

雨燕双飞 提交于 2019-11-27 12:45:16
  ZYNQ的SDK是用C语言进行开发的,C语言可以说是当今理工类大学生的必备技能。我本科学C语言时就是对付考试而已,后面在51单片机里用C语言编过一些课程设计,真的是不熟。现在特开一帖,整理一下C语言的基础知识。 一、位操作 运算符 & | ^ ~ << >> 含义 按位与 按位或 按位异或 取反 左移 右移 tips:不改变其他位的状况下,对某几位赋值,分两步实现 ①用 & 进行清0操作: a &= 0x0F ; //对 第4-7位清0,第0-3位的值不变 ②用 | 进行赋值操作: a |= 0x20 ; // 对第4-7位赋值为2,第0-3位的值不变 二、define宏定义 常见格式: #define 标识符 字符串 例如: #define A 8 那么A的值就为8 三、ifdef条件编译 不仅是C语言还是Verilog,都会经常使用这个功能。 // 标识符已被#define定义过则编译程序段1,否则编译程序段2 //=========================================================== #ifdef 标识符 程序段1 #else 程序段2 #endif // #else部分也可以没有 //=========================================================== #ifdef

Linux内核中双向链表struct list_head

不羁的心 提交于 2019-11-27 10:22:48
一、双向链表list_head Linux内核驱动开发会经常用到Linux内核中经典的双向链表list_head,以及它的拓展接口和宏定义:list_add、list_add_tail、list_del、list_entry、list_for_each等。 在内核源码中,list_head结构体的定义在文件source_code/include/linux/types.h文件中,结构体定义如下: 通过这个结构体开始构建链表,然后插入、删除节点,遍历整个链表等,内核已经提供好了现成的调用接口。 1、创建链表 Linux内核中提供了下面的接口来进行双向链表初始化: 可以通过LIST_HEAD(my_lsit)来进行一个双向链表的初始化,初始化后,my_list的prev和next指针都将指向自己,如下: struct list_head my_list = {&my_list, &my_list}; 正常的链表都是为了遍历结构体中其它有意义的字段而创建的,但是上面定义的my_list中只有prev和next指针,因此没有实际意义的字段数据,所以,需要创建一个宿主结构,然后在此结构中嵌套my_list字段,宿主结构中又有其它的字段,例如: struct my_task_lsit {   int val;   struct list_head my_list; }

Go 系列教程 —— 26. 结构体取代类

試著忘記壹切 提交于 2019-11-27 09:32:19
欢迎来到 Golang 系列教程 的第 26 篇。 Go 支持面向对象吗? Go 并不是完全面向对象的编程语言。Go 官网的 FAQ 回答了 Go 是否是面向对象语言,摘录如下。 可以说是,也可以说不是。虽然 Go 有类型和方法,支持面向对象的编程风格,但却没有类型的层次结构。Go 中的“接口”概念提供了一种不同的方法,我们认为它易于使用,也更为普遍。Go 也可以将结构体嵌套使用,这与子类化(Subclassing)类似,但并不完全相同。此外,Go 提供的特性比 C++ 或 Java 更为通用:子类可以由任何类型的数据来定义,甚至是内建类型(如简单的“未装箱的”整型)。这在结构体(类)中没有受到限制。 在接下来的教程里,我们会讨论如何使用 Go 来实现面向对象编程概念。与其它面向对象语言(如 Java)相比,Go 有很多完全不同的特性。 使用结构体,而非类 Go 不支持类,而是提供了 结构体 。结构体中可以添加 方法 。这样可以将数据和操作数据的方法绑定在一起,实现与类相似的效果。 为了加深理解,我们来编写一个示例吧。 在示例中,我们创建一个自定义 包 ,它帮助我们更好地理解,结构体是如何有效地取代类的。 在你的 Go 工作区创建一个名为 oop 的文件夹。在 opp 中再创建子文件夹 employee 。在 employee 内,创建一个名为 employee.go 的文件。

Go 系列教程 —— 27. 组合取代继承

99封情书 提交于 2019-11-27 09:32:01
欢迎来到 Golang 系列教程 的第 27 篇。 Go 不支持继承,但它支持组合(Composition)。组合一般定义为“合并在一起”。汽车就是一个关于组合的例子:一辆汽车由车轮、引擎和其他各种部件组合在一起。 通过嵌套结构体进行组合 在 Go 中,通过在结构体内嵌套结构体,可以实现组合。 组合的典型例子就是博客帖子。每一个博客的帖子都有标题、内容和作者信息。使用组合可以很好地表示它们。通过学习本教程后面的内容,我们会知道如何实现组合。 我们首先创建一个 author 结构体。 package main import ( "fmt" ) type author struct { firstName string lastName string bio string } func (a author) fullName() string { return fmt.Sprintf("%s %s", a.firstName, a.lastName) } 在上面的代码片段中,我们创建了一个 author 结构体, author 的字段有 firstname 、 lastname 和 bio 。我们还添加了一个 fullName() 方法,其中 author 作为接收者类型,该方法返回了作者的全名。 下一步我们创建 post 结构体。 type post struct { title

c++ 结构

僤鯓⒐⒋嵵緔 提交于 2019-11-27 08:35:57
结构 结构是 C++ 中另一种 用户自定义的可用的数据类型 ,它 允许存储不同类型的数据项 比如,一本图书的结构: Title :标题 Author :作者 Subject :类目 Book ID :书的 ID 一、定义 struct type_name { member_type1 member_name1; member_type2 member_name2; member_type3 member_name3; . . } object_names; type_name 是结构体类型的名称,member_type1 member_name1 是标准的变量定义,比如 int i; 或者 float f; 或者其他有效的变量定义。在结构定义的末尾,最后一个分号之前,您可以指定一个或多个结构变量,这是可选的。 比如: struct Books { char title[50]; char author[50]; char subject[100]; int book_id; } book; 二、访问结构成员 成员访问运算符(.) #include <iostream> #include <cstring> using namespace std; // 声明一个结构体类型 Books struct Books { char title[50]; char author[50];

c#中的结构体

狂风中的少年 提交于 2019-11-27 08:19:35
在 C# 中,结构体是值类型数据结构。它使得一个单一变量可以存储各种数据类型的相关数据。(默认修饰符:结构体和类--private 枚举和接口--public) 结构体的特点 结构可带有方法、字段、索引、属性、运算符方法和事件。 结构可定义构造函数,但不能定义析构函数。但是,您不能为结构定义无参构造函数。无参构造函数(默认)是自动定义的,且不能被改变。(在自定义构造函数中要为所有的字段初始化,而定义字段的时候是不能赋值的) 与类不同,结构不能继承其他的结构或类。 结构不能作为其他结构或类的基础结构。 结构可实现一个或多个接口。 结构成员不能指定为 abstract、virtual 或 protected。 当您使用 New 操作符创建一个结构对象时,会调用适当的构造函数来创建结构。与类不同,结构可以不使用 New 操作符即可被实例化。 如果不使用 New 操作符,只有在所有的字段都被初始化之后,字段才被赋值,对象才被使用。 public interface ICompany { void payOff(); } struct ComInf : ICompany { public int employeeNum; string comAddress; bool isListed; public ComInf(int e,string c,bool i) { this

C语言结构体类型的强制转换

强颜欢笑 提交于 2019-11-27 08:07:51
当所用到的各个层次的成员较多时,我们会定义多个结构体函数,但是在传输过程中我们需要具体的指定哪一个结构体作为传输的数据,又C语言中的结构体并不能直接进行强制类型转换,只有结构体的指针可以进行强制类型转换,因此中间涉及到指针的问题,也就涉及到指向空间地址的问题。 我们定义一个结构体如下: typedef struct stdudent { char name[20]; int age; }student_t; 它的含义如下: 第一种: struct student student_1; //定义了一个student_1的结构体变量 第二种:student_t student_1 //定义了一个student_1的结构体变量 当我们调用子函数时,可能需要传递参数如下: void *run(void *play) struct stdudent *Play = (stdudent_t *)play; //因为void 指针是无类型(假设为void * a ),可以接受任何其他类型的指针, //所以一搬用于形参来接受参数,但当你要使用这个指针的时候就必须转换为具体的类型。所以进行强制转换。 附上例子说明: #include <iostream> #include <algorithm> using namespace std; typedef struct student { string

Swift学习笔记 (二十三) 构造过程(上)

旧城冷巷雨未停 提交于 2019-11-27 07:30:01
构造过程是使用类、结构体或枚举类型的实例之前的准备过程。在新实例使用前有个过程是必须的,它包括设置实例中每个存储 属性的初始值和执⾏其他必须的设置或构造过程。 你要通过定义构造器来实现构造过程,它就像用来创建特定类型新实例的特殊方法。 与 Objective-C 中的构造器不同, Swift 的 构造器没有返回值 。它们的主要任务是保证某种类型的新实例在第一次使用前完成正确的初始化。 类的实例也可以通过实现析构器来执⾏它释放之前自定义的清理工作。 想了解更多关于析构器的内容,请参考《析构过程》。 存储属性的初始赋值 类和结构体在创建实例时,必须为所有存储型属性设置合适的初始值。存储型属性的值不能处于一个未知的状态。你可以在构造 器中为存储型属性设置初始值,也可以在定义属性时分配默认值。 以下小节将详细介绍这两种方法。 注意 当你为存储型属性分配默认值或者在构造器中设置初始值时,它们的值是被直接设置的,不会触发任何属性观察者。 构造器 构造器在创建某个特定类型的新实例时被调用。 它的最简形式类似于一个不带任何形参的实例方法,以关键字 init 命名: init() { // 在此处执⾏构造过程 } 下⾯例子中定义了一个⽤来保存华氏温度的结构体 Fahrenheit ,它拥有一个 Double 类型的存储型属性temperature : struct Fahrenheit { var

Go 系列教程 —— 16. 结构体

给你一囗甜甜゛ 提交于 2019-11-27 07:07:55
什么是结构体? 结构体是用户定义的类型,表示若干个字段(Field)的集合。有时应该把数据整合在一起,而不是让这些数据没有联系。这种情况下可以使用结构体。 例如,一个职员有 firstName 、 lastName 和 age 三个属性,而把这些属性组合在一个结构体 employee 中就很合理。 结构体的声明 type Employee struct { firstName string lastName string age int } 在上面的代码片段里,声明了一个结构体类型 Employee ,它有 firstName 、 lastName 和 age 三个字段。通过把相同类型的字段声明在同一行,结构体可以变得更加紧凑。在上面的结构体中, firstName 和 lastName 属于相同的 string 类型,于是这个结构体可以重写为: type Employee struct { firstName, lastName string age, salary int } 上面的结构体 Employee 称为 命名的结构体(Named Structure) 。我们创建了名为 Employee 的新类型,而它可以用于创建 Employee 类型的结构体变量。 声明结构体时也可以不用声明一个新类型,这样的结构体类型称为 匿名结构体(Anonymous Structure) 。