指针

18.Go语言基础之反射

◇◆丶佛笑我妖孽 提交于 2020-02-25 15:25:33
1.变量的内在机制 Go语言中的变量是分为两部分的: 类型信息:预先定义好的元信息。 值信息:程序运行过程中可动态变化的。 2.反射介绍 在Python中,Java中,都有反射的概念。 反射是"指程序运行期对程序本身进行访问和修改的能力"。 程序在编译时,变量被转换为内存地址,变量名不会被编译器写入到可执行部分。在运行程序时,程序无法获取自身的信息。 支持反射的语言,可以再程序编译期将变量的反射信息,如字段名称、类型信息、结构体信息等正和岛可执行文件中,并给程序提供接口,访问反射信息,这样就可以在程序运行期获取类型的反射信息,并且有能力修改它们。 Go程序在运行期使用reflect包访问程序的反射信息。 上面我们介绍过空接口,空接口可以存储任意类型的变量,那我们怎样知道空接口保存的数据是什么呢?"反射就是在运行时动态的获取一个变量的类型信息和值信息。" 3.reflect包 在Go语言的反射机制中,任何接口都由"一个具体类型"和"具体类型的值"两部分组成。 在Go语言中反射的相关功能由内置的reflect包提供,任意接口值在反射中都可以理解为由reflect.Type和reflect.Value两部分组成,并且reflect包提供了reflect.TypeOf和reflect.ValueOf两个函数来获取任意对象的Value和Type。 3.1TypeOf 在Go语言中

pthread_create

放肆的年华 提交于 2020-02-25 14:46:59
pthread_create 编辑本段 函数简介   pthread_create是UNIX环境创建线程函数 头文件   #include<pthread.h> 函数声明   int pthread_create( pthread_t *restrict tidp,const pthread_attr_t *restrict_attr,void*(*start_rtn)(void*),void *restrict arg); 返回值   若成功则返回0,否则返回出错编号   返回成功时,由tidp指向的内存单元被设置为新创建线程的线程ID。attr参数用于制定各种不同的线程属性。新创建的线程从start_rtn函数的地址开始运行,该函数只有一个万能指针参数arg,如果需要向start_rtn函数传递的参数不止一个,那么需要把这些参数放到一个结构中,然后把这个结构的地址作为arg的参数传入。   linux下用C开发多线程程序,Linux系统下的多线程遵循POSIX线程接口,称为pthread。   由 restrict 修饰的指针是最初唯一对指针所指向的对象进行存取的方法,仅当第二个指针基于第一个时,才能对对象进行存取。对对象的存取都限定于基于由 restrict 修饰的指针表达式中。 由 restrict 修饰的指针主要用于函数形参,或指向由 malloc() 分配的内存空间

UPnP与Win XP 缺陷之完全解析 ZT

混江龙づ霸主 提交于 2020-02-25 12:38:32
统一即插即用英文是Universal Plug and Play,缩写为UPnP。要说计算机外设的即插即用(Plug and Play(缩写PnP)),大家可能很熟悉,但对统一即插即用,多数人会感到是一头雾水。由于windows xp加入对UPnP的支持,并且被查出存在很严重的安全问题,所以,一时间,使得UPnP名声大噪。巧的是,本人原来查阅过关于UPnP的技术白皮书,而且也较为详细地看了关于此次发现的安全缺陷的介绍。因此,趁着这个机会,将UPnP以及引起安全缺陷的详情披露出来。 一、 UPnP是用来干什么的?   网络发展到现在,已经可以使我们在网上冲浪、收发邮件、听到远方传送来的声音、搜索感兴趣的内容、下载软件、点播节目、即时聊天等等、等等……实现的功能好像已经不少,但,人的欲望无止境,享福人还想更享福,还有许多目标没有达到:例如,怎样才能使我们在网络上,像平时用遥控器那样,操作空调器、电风扇、厨房电器,或网络远端的电器设备呢?如何利用网络上的计算机资源,使这种“遥控”更具智能化?甚至,将一系列相关的控制写到一个脚本中,以便用户定制自己所喜爱的控制流程?……等等。实现诸如此类的效果,将是有巨大需求的应用技术。如果实现通过网络用UPnP控制家用设备,将给我们的生活带来很大的方便和很多新的体验。例如:   1.你在下班之前,或在回去的路上,就可以先打开家里的空调器和厨房设备

快慢指针实现不依赖计数器寻找中位数(linked list)

夙愿已清 提交于 2020-02-25 12:33:19
该方法在不借助 计数器 变量实现寻找中位数的功能。原理是:快指针的移动速度是慢指针移动速度的2倍,因此当快指针到达 链表 尾时,慢指针到达中点。程序还要考虑链表结点个数的奇偶数因素,当快指针移动x次后到达表尾(1+2x),说明链表有奇数个结点,直接返回慢指针指向的数据即可。如果快指针是倒数第二个结点,说明链表结点个数是偶数,这时 可以 根据 “规则”返回上中位数或下中位数或(上中位数+下中位数)的一半。 while (fast&&slow)   {   if (fast->next==NULL)   return slow ->data;   else if (fast->next!= NULL && fast->next->next== NULL)   return (slow ->data + slow ->next->data)/2;   else   {   fast= fast->next;   fast= fast->next;   slow = slow ->next;   }   } 来源: https://www.cnblogs.com/mdz-great-world/p/6549816.html

8.4指针数组、指向指针的指针、main函数的参数、指针小结、关于void类型和const

一个人想着一个人 提交于 2020-02-25 10:45:30
(七)指针数组 概念:一个数组,若其元素均为指针类型数据,称为指针数组,也就是说,指针数组中的每一个元素相当于一个指针变量。 一维指针数组的定义形式为: 类型名 *数组名[数组长度]; 例如: int *name[4]; 由下图可知: 程序前两句和第三句相等。 指针数组元素的的值为数组中元素的值的首地址。 如:指针数组pa1的第0个元素pa1[0]的值为0x0018fef0,指向数组stra[0]的首地址。 用例:将字符串按字母排序(由小到大)输出。 # include <stdio.h> # include <string.h> void main ( ) { void sort ( char * array [ ] , int n ) ; void print ( char * array [ ] , int n ) ; char * name [ ] = { "Hello world" , "hello world" , "hello" , "china" } ; sort ( name , 4 ) ; print ( name , 4 ) ; } void sort ( char * array [ ] , int n ) { int i , j , m ; char * temp ; for ( i = 0 ; i < n ; i ++ ) { for ( j = i +

Delphi指针长度

空扰寡人 提交于 2020-02-25 10:35:34
要点: 1.指针指向的内容的大小因数据类型的不同而不同,指针本事的大小,都是4字节 2.sizeof函数是取形参所占的内存大小 3.IntToHex是把整数型的值,转换为16进制的值,第二个参数是16进制的长度为多少位 program MyPoint; //指针详解 {$APPTYPE CONSOLE} uses SysUtils,windows,Generics.Collections ; {指针长度} procedure MyFunc3(); var MyInt : Integer;//整数 MyPoint : PInteger; //定义指针 MyByte : Byte; MyPintByte : PByte; begin MyInt := 2; MyByte := 3; {byte型和integer型的指针} MyPoint := @MyInt; MyPintByte := @MyByte; {输出2者地址} Writeln('MyPoint :' + IntToHex(Integer((MyPoint)),8)); Writeln('MyPintByte :' + IntToHex(Integer((MyPintByte)),8)); Inc(MyPoint); Inc(MyPintByte); {调用Inc之后byte和integer地址一个多1,一个多4}

第六十一课、智能指针类模板

心不动则不痛 提交于 2020-02-25 02:04:18
一、智能指针 1、智能指针的意义 (1)、现代c++开发库中 最重要的类模板之一 (2)、c++中 自动内存管理 的重要手段 (3)、能够很大程度上 避开内存相关的 问题 2、STL中的只能指针 auto_ptr (1)、 生命周期结束时,销毁指向的内存空间 (2)、 不能指向堆数组 (否则发生内存泄漏),只能指向堆对象(变量) (3)、一片堆空间 只属于一个内存指针对象 (防止多次释放) (4)、多个只能指针对象 不能 指向同一片堆空间 #include <iostream> #include <string> #include <memory> using namespace std; class Test { string m_name; public: Test(const char* name) { cout << "Hello, " << name << "." << endl; m_name = name; } void print() { cout << "I'm " << m_name << "." << endl; } ~Test() { cout << "Goodbye, " << m_name << "." << endl; } }; int main() { auto_ptr<Test> pt(new Test("D.T.Software")); cout

文件操作

眉间皱痕 提交于 2020-02-24 23:01:24
一.文件的打开与关闭  1.定义文件指针的一般形式:FILE *指针变量标识符  2.C语言中有三个特殊的文件指针无需定义、打开可直接使用:    stdin:标准输入,默认为当前终端(键盘)      我们使用的scanf、getchar、函数默认从此终端获得数据    stdout:标准输出,默认为当前终端(屏幕)      我们使用的printf、puts函数默认输出信息到此终端    stderr:标准出错,默认为当前终端(屏幕)      当我们程序出错或使用perror函数时信息打印在此终端  3.打开文件    FILE *fp = NULL;    fp = fopen(文件名,文件打开方式);    • 文件名:要操作的文件的名字,可以包含路径信息     • 文件打开方式:"读"、"写"、"文本"、"二进制"等    • fp文件指针:指向被打开的文件,失败返回空,成功返回相应指针    例如:FILE *fp = NULL;       fp = fopen("test.txt","r");       if(fp == NULL)        printf("File open error\n");  4.文件打开的几种方式:读写权限:r  w  a  +   r:以只读方式打开文件     文件不存在,返回NULL     文件存在,返回文件指针

指针的越界崩溃

谁都会走 提交于 2020-02-24 22:00:19
#include <stdio.h> void test() { printf("输出了内容\n"); } int main(void) { test(); int number = 10; // 定义指针的方式: 需要指向的类型 *指针的名称 = 0; int* point = 0; // 这个写法是定义指针并且指向地址 0(空指针) // 为指针赋值: [应该]使用对应指针类型的变量地址赋值给指针 point = &number; // 使用指针: 自己的地址&point + 指向的地址 point + 指向的地址上保存的内容 *point printf("%p %p %d\n", &point, point, *point); char chr = 'a'; // 97 0x61 point = (int*)&chr; // 访问到的数据是字符所占的1字节 + 紧随的后3字节 printf("*point = %x\n", *point); // 修改到的数据是字符所占的1字节 + 紧随的后3字节 // 产生了越界的修改,会导致程序的崩溃 *point = 200; printf("*point = %x\n", *point); return 0; } 来源: https://www.cnblogs.com/lianfeng132/p/12358672.html