指针变量

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语言中

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

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

心不动则不痛 提交于 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

数据结构与算法分析:(三)链表(上)

让人想犯罪 __ 提交于 2020-02-24 13:54:32
一、什么是链表? 链表是一种物理上 非连续 、 非顺序 的存储结构,数据元素之间的顺序是通过每个元素的 指针 (类似C语言中的指针,Java中是引用)关联的。 链表由一系列节点组成,每个节点一般至少会包含两部分信息:一部分是元素数据本身,另一部分是指向下一个元素地址的“指针”。这样的存储结构让链表相比其他线性的数据结构来说,操作会复杂一些。 说到链表,我们经常拿来与数组比。我们先看下面一张图再来对比它们的各自的优劣。 从图中我们看到,数组需要一块 连续 的内存空间来存储,对内存的要求比较高。如果我们申请一个 100MB 大小的数组,当内存中没有连续的、足够大的存储空间时,即便内存的剩余总可用空间大于 100MB,仍然会申请失败。 而链表恰恰相反,它并不需要一块连续的内存空间,它通过“指针”将一组零散的内存块串联起来使用,所以如果我们申请的是 100MB 大小的链表,根本不会有问题。 这里先思考一下下面这个问题。 Q:数组在实现上为什么使用的是连续的内存空间? A:可以借助 CPU 的缓存机制,预读数组中的数据,所以访问效率更高。而链表在内存中并不是连续存储,所以对 CPU 缓存不友好,没办法有效预读。 Q:上一答案中CPU缓存机制指的是什么?为什么就数组更好了? A: CPU在从内存读取数据的时候,会先把读取到的数据加载到CPU的缓存中

C++内存管理转自http://soft.yesky.com/lesson/110/2381610.shtml

拈花ヽ惹草 提交于 2020-02-23 15:04:50
转自 http://soft.yesky.com/lesson/110/2381610.shtml 踏入C++中的雷区——C++内存管理详解 2006-04-25 09:22 作者:蒋涛 出处:计算机教学网 责任编辑:方舟   伟大的Bill Gates 曾经失言:   640K ought to be enough for everybody — Bill Gates 1981   程序员们经常编写内存管理程序,往往提心吊胆。如果不想触雷,唯一的解决办法就是发现所有潜伏的地雷并且排除它们,躲是躲不了的。本文的内容比一般教科书的要深入得多,读者需细心阅读,做到真正地通晓内存管理。    1、内存分配方式   内存分配方式有三种:   (1)从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量。   (2)在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。   (3) 从堆上分配,亦称动态内存分配。程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存。动态内存的生存期由我们决定,使用非常灵活,但问题也最多。    2

LeetCode 力扣 76. 最小覆盖子串

自闭症网瘾萝莉.ら 提交于 2020-02-23 11:51:19
题目描述(困难难度) 给两个字符串,S 和 T,在 S 中找出包含 T 中所有字母的最短字符串,不考虑顺序。 解法一 滑动窗口 没有想出来,直接看来了 题解 ,这里总结一下。 用双指针 left 和 right 表示一个窗口。 right 向右移增大窗口,直到窗口包含了所有要求的字母。进行第二步。 记录此时的长度,left 向右移动,开始减少长度,每减少一次,就更新最小长度。直到当前窗口不包含所有字母,回到第 1 步。 S = "ADOBECODEBANC" , T = "ABC" A D O B E C O D E B A N C //l 和 r 初始化为 0 ^ l r A D O B E C O D E B A N C //向后移动 r,扩大窗口 ^ ^ l r A D O B E C O D E B A N C //向后移动 r,扩大窗口 ^ ^ l r A D O B E C O D E B A N C //向后移动 r,扩大窗口 ^ ^ l r A D O B E C O D E B A N C //向后移动 r,扩大窗口 ^ ^ l r //此时窗口中包含了所有字母(ABC),停止移动 r,记录此时的 l 和 r,然后开始移动 l A D O B E C O D E B A N C ^ ^ l r //向后移动 l,减小窗口,此时窗口中没有包含所有字母(ABC)

指针变量和普通变量的值

白昼怎懂夜的黑 提交于 2020-02-23 11:23:02
指针变量有3个值,自己的地址,保存的地址和保存地址内的值 #include <cstdio> int main(){ int a=10; int *p=&a; printf("p的地址:%p\n",&p); printf("p保存的地址:%p\n",p); printf("p保存地址内的值:%d\n",*p); return 0; } 普通变量有2个值,自己的地址,自己的值 #include <cstdio> int main(){ int a=10; printf("a的地址:%p\n",&a); printf("a的值:%d\n",a); return 0; } 来源: https://www.cnblogs.com/litifeng/p/12348702.html