结构体类型

共用体和结构体

余生长醉 提交于 2019-11-27 02:21:06
编译器会为结构体变量中的每个数据成员分配不同的地址空间,也就是说,结构体变量中的数据程序是并列关系,而编译器为共用体变量中的数据成员分配的是同一块内存,每个时刻只有一个数据成员有意义,从地址的角度来看两者的差异,形象地表明了这一点 #include <stdio.h> #include <stdlib.h> #include <string.h> //初始化方式和结构体类似 union data{ //类似于结构体变量,共享内存,共用体的大小等于最长的那一段,共用体变量在任何时刻只有一个成员变量存在,定义的时候不能初始化,只有在创建的时候才能初始化 int price; char brand[20]; }d1, d2, *pData, data[10]; union key{ //共用体会存在字节数填充,直到可以被最小类型字节数整除,double有8个字节,a数组有9个,再填充7个字节,恰好被double整除 //内存对齐的方式,分别CPU寻址 double d; char a[9]; } k; //sizeof(k) =16 void main(){ printf("%d\n", sizeof(d1)); //20 d1.price = 100; strcpy(d1.brand,"IBM"); d2 =d1; //共用体变量可以直接赋值 printf("%d,%s\n",d1

9.Go-反射、日志和线程休眠

百般思念 提交于 2019-11-26 21:01:54
9.1反射 在Go语言标准库中reflect包提供了运行时反射,程序运行过程中动态操作结构体 当变量存储结构体属性名称,想要对结构体这个属性赋值或查看时,就可以使用反射 反射还可以用作判断变量类型 整个reflect包中最重要的两个类型 reflect.Type类型 reflect.Value值 获取到Type和Value的函数 reflect.TypeOf(interface{})返回type reflect.ValueOf(interface{})返回值Value  (1)获取变量属性和值 //Learn_Go/main.go package main import ( "fmt" "reflect" ) func main() { a := 1.5 fmt.Println(reflect.TypeOf(a)) //float64 fmt.Println(reflect.ValueOf(a)) //1.5 }  (2)获取结构体属性的值 //Learn_Go/main.go package main import ( "fmt" "reflect" ) type People struct { name string address string } func main() { peo := People{"derek","guangdong"} v := reflect

不透明指针_C语言

﹥>﹥吖頭↗ 提交于 2019-11-26 19:25:21
C++与C的比较 C++与C的最大区别是:C++是面向对象的编程语言,C是面向过程的编程语言。C++拥有封装、继承、多态等OO编程思想。C语言不具备这些内置功能。虽然C语言有结构体struct,可以将数据放在统一的结构中。但它不能控制外部用户对结构体内数据的访问权限。不像C++可以提供public、protected、private限定符来控制数据的访问权限。所以struct只是将数据 打包 ,而class是将数据 封装 。 不透明指针的作用 不透明指针可以在C语言中实现数据的 封装 。 什么是不透明指针 C语言中,我们可以在未定义结构体时先声明此结构体的指针类型。形式如下: typedef struct Point* PointPtr; PointPtr pPoint = nullptr; 此时PointPtr就是不透明指针类型。pPoint就是不透明指针。由于未定义结构体,所以pPoint引用不到Point结构体的具体数据。也就相当于class的private属性。从而实现了封装。 应用方式 提供一个.h文件。文件中定义不透明指针类型。并extern几个全局函数提供真实数据的访问方法以及结构体开辟空间、释放空间的方法。.c文件中定义结构体并实现这些方法。代码如下: opacityPoint.h: #pragma once /***************************

Swift学习笔记 (十九) 属性

大憨熊 提交于 2019-11-26 16:47:43
属性将值与特定的类、结构体或枚举关联。存储属性会将常量和变量存储为实例的一部分,⽽计算属性则是直接计算(而不是存 储)值。计算属性可以用于类、结构体和枚举,⽽存储属性只能用于类和结构体。 存储属性和计算属性通常与特定类型的实例关联。但是, 属性也可以直接与类型本身关联,这种属性称为类型属性 。 另外,还可以定义属性观察器来监控属性值的变化,以此来触发自定义的操作。 属性观察器可以添加到类本身定义的存储属性 上,也可以添加到从⽗类继承的属性上。 存储属性 简单来说,一个 存储属性就是存储在特定类或结构体实例里的一个常量或变量。存储属性可以是变量存储属性(用关键字var 定 义),也可以是常量存储属性(⽤关键字 let 定义)。 可以在定义存储属性的时候指定默认值,请参考默认构造器 一节。也可以在构造过程中设置或修改存储属性的值,甚⾄修改常量 存储属性的值(常量属性没有初始值的情况下),请参考《构造过程中常量属性的修改》 一节。 下⾯的例子定义了一个名为 FixedLengthRange 的结构体,该结构体用于描述整数区间,且这个范围值在被创建后不能被修改。 struct FixedLengthRange { var firstValue: Int let length: Int } var rangeOfThreeItems = FixedLengthRange(firstValue

linux内核-双向链表

好久不见. 提交于 2019-11-26 14:58:00
linux中的经典宏定义 offsetof 定义:offsetof在linux内核的include/linux/stddef.h中定义。 #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER) 说明 :获得结构体(TYPE)的变量成员(MEMBER)在此结构体中的偏移量。 (01) ( (TYPE *)0 ) 将零转型为TYPE类型指针,即TYPE类型的指针的地址是0。 (02) ((TYPE *)0)->MEMBER 访问结构中的数据成员。 (03) &( ( (TYPE *)0 )->MEMBER ) 取出数据成员的地址。由于TYPE的地址是0,这里获取到的地址就是相对MEMBER在TYPE中的偏移。 (04) (size_t)(&(((TYPE*)0)->MEMBER)) 结果转换类型。对于32位系统而言,size_t是unsigned int类型;对于64位系统而言,size_t是unsigned long类型。 container_of 定义 :container_of在linux内核的include/linux/kernel.h中定义。 #define container_of(ptr, type, member) ({ \ const typeof( ((type *)0)->member ) *_

gopl 反射2

…衆ロ難τιáo~ 提交于 2019-11-25 23:22:37
本篇各章节的主要内容: 使用 reflect.Value 来设置值:通过 Elem() 方法获取指针对应的值,然后就可以修改值 示例,解码 S 表达式:之前内容的综合运用 访问结构体成员标签:像JSON反序列化那样,使用反射获取成员标签,并填充结构体的字段 显示类型的方法:通过一个简单的示例,获取任意值的类型,并枚举它的方法,还可以调用这些方法 注意事项:慎用反射,原因有三 使用 reflect.Value 来设置值 到目前为止,反射只是用来 解析 变量值。本节的重点是 改变 值。 可寻址的值(canAddr) reflect.Value 的值,有些是可寻址的,有些是不可寻址的。通过 reflect.ValueOf(x) 返回的 reflect.Value 都是不可寻址的。但是通过指针提领得来的 reflect.Value 是可寻址的。可以通过调用 reflect.ValueOf(&x).Elem() 来获得任意变量 x 可寻址的 reflect.Value 值。 可以通过变量的 CanAddr 方法来询问 reflect.Value 变量是否可寻址: x := 2 // value type variable? a := reflect.ValueOf(2) // 2 int no b := reflect.ValueOf(x) // 2 int no c := reflect

gopl 底层编程(unsafe包)

筅森魡賤 提交于 2019-11-25 23:22:25
包 unsafe 广泛使用在和操作系统交互的低级包中, 例如 runtime、os、syscall、net 等,但是普通程序是不需要使用它的。 unsafe.Sizeof、Alignof 和 Offsetof 函数 unsafe.Sizeof 报告传递给它的参数在内存中占用的字节(Byte)长度(1Byte=8bit,1个字节是8位),参数可以是任意类型的表达式,但它不会对表达式进行求值。对 Sizeof 的调用会返回一个 uintptr 类型的常量表达式,所以返回的结果可以作为数组类型的长度大小,或者用作计算其他的常量: fmt.Println(unsafe.Sizeof(float64(0))) // "8" fmt.Println(unsafe.Sizeof(uint8(0))) // "1" 函数 Sizeof 仅报告每个数据结构固定部分的内存占用的字节长度。以字符串为例,报告的只是字符串对应的指针的字节长度,而不是字符串内容的长度: func main() { var x string x = "a" fmt.Println(unsafe.Sizeof(x), len(x)) // "16 1" var s []string for i := 0; i < 10000; i++ { s = append(s, "Hello") } x = strings.Join(s,

C++ 数据结构

自古美人都是妖i 提交于 2019-11-25 19:29:48
一、C++ 数据结构 C/C++ 数组允许定义可存储相同类型数据项的变量,但是结构是 C++ 中另一种用户自定义的可用的数据类型,它允许您存储不同类型的数据项。 结构用于表示一条记录,假设您想要跟踪图书馆中书本的动态,您可能需要跟踪每本书的下列属性: Title :标题 Author :作者 Subject :类目 Book ID :书的 ID 1.1 定义结构 为了定义结构,您必须使用 struct 语句。struct 语句定义了一个包含多个成员的新的数据类型,struct 语句的格式如下: 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; 或者其他有效的变量定义。在结构定义的末尾,最后一个分号之前,您可以指定一个或多个结构变量,这是可选的。下面是声明一个结构体类型 Books,变量为 book: struct Books { char title [ 50 ] ; char author [ 50 ] ; char subject