初步认识句柄

复制,粘贴,转载,没任何意见,不过还请注明出处,毕竟也是自己的心血~~

作为承上启下的一篇文章,以后以章节命名(可能会以故事的形式出现)

1、承上:HWND,HINSTANCE这些被称作句柄的标识符作用?如何算精通结构体?

我很欣赏黑格尔的一句话,存在即合理。何为柄,最简单的方式就是理解伞柄,100个人撑开100把伞,总共有100个伞柄,每一个伞柄都对应着一把伞,似乎发现了什么?如果我给这100把伞的伞柄都取不同的名字,我可以根据伞柄名字找到对应的伞,句柄的作用的类似与伞柄,伞对应着程序,不同的程序有需要加载不同的文件或资源或改变属性(简单理解,就是从磁盘中获取自己需要的内存内容),句柄就是对这些资源的标识,通过它,你可以找到需要的内存内容,来看一个最简单的例子(开始对上一篇文章内容进行分析咯,个人见解,有好的想法欢迎讨论~~)

HWND hwnd;

hwnd = CreateWindow(szAppName, // window class name

TEXT("我的第一个应用程序"), //window caption

WS_OVERLAPPEDWINDOW, // window style 

CW_USEDEFAULT,  // initial x position

CW_USEDEFAULT,  // initial y position 

CW_USEDEFAULT,  // initial x size 

CW_USEDEFAULT,  // initial y size 

NULL,           // parent window handle

NULL,           // window menu handle

hInstance,      // program instance handle

NULL);          // creation parameters   

HWND 是一个窗口句柄,然后HWND hwnd;就是给一个句柄起一个名字叫做hwnd,hwnd = CreateWindow(...);CreateWindow()这是一个创建窗口函数,内部做了哪些事呢?很简单,就是创建了一个显示窗口所需要的资源内存,现在的句柄有了一个特定的名字,叫做hwnd(当然,名字这玩意,全凭程序员爸爸),且hwnd=CreateWindow(...);从逻辑上可以得知,他们之间一定存在关系(至于是赋值还是其他,这个往后看,就知道了)不管怎么样,现在我可以通过这个玩意获取到我需要的内存内容了。(学习的过程中,肯定会有或多或少的疑问,个人逻辑是先了解作用是什么,再去谈实现或者内部原理,在我的算法文章里会有这种逻辑概念)

问:上面的伞柄例子,为什么给伞柄命名,而不给伞本身命名?我直接使用 CreateWindow(...)不行吗?为什么要           通过一个叫做窗口句柄的东西?

答:为了回答这个问题,现在再看一个例子,能看这些文章的,肯定是有基础的,没基础的请移步我文集里的《零基础学编程》,先看c++中的函数:


内存中的值显示到控制台

上一个例子很简单,创建一个控制台,然后就是输入以上代码


这一种写法有人使用不,虽然可行,那如果再加上参数,嘻嘻,你懂的


这是常规做法(命名不要向我这么不规范)

再看这个代码,即使是a或者b,都会有int关键字,说白了,int也是标识符,然后将show1()的内存值赋值给a,细心的发现了,上面说有hwnd=CreateWindow(...);这个是赋值还是其他的问题,如果我的函数返回的是指针,该用什么去接收,

指针函数?

下面看一下这个运行


两个地址打印不一样??

基于这个,有什么想法没?不管逻辑是什么,接着看:


很有意思的一件事

第一:函数体内的两句话被打印两次,且地址不同;

第二:指针p的地址与第一次a、q的地址相同,show1()的地址值与第二次a、q的地址值相同;

第三:出现的两种地址相差一个int的大小,

基于以上三点,可尝试推论:

推论1:如果把int换成double,你会发现,地址相差一个double的大小

推论2:这两者之间存在某种关系

眼尖的同学发现了,局部变量,还给了一个警告,基于此,推论以及第一,第二,第三都是错误的,想了解的同学请查看,《堆栈的故事》

还有就是以上或以下截图不能运行请添加return 0;//这里这么用做个引子,会讲为什么的

int main(){

//...

return 0;

}

特此说明

这才符合逻辑

句柄的出现,是为了方便保存,就像你用一个变量保存函数的值或者指针一样,(也可以理解为句柄就是指针),这里说一个概念,指针的指针也是指针,嘻嘻~~,不管是指针,还是指针的指针,还是指针的指针的指针,其作用和目的都是获取内存内容,单个的也好,结构体也罢,只是方式上有一定的区别,至于区别在哪里,以后分析,暂时用不到,先了解作用。


问:如何才算精通结构体?

答:不仅会用,还要知道结构体为什么会出现,数组和结构体的关系是什么?一步一步来(为了能让大家更好的明白,所有的都会给出源码,如果是图片,那里面就那么点代码,多的,给链接,或者给百度云)

先看结构体的用法:



很简单,对不对

从内存方面理解结构体


注意观看对比(代码就29行,没有漏)

结论:

          1.地址一样,取出的内存值一样

          2.student1的地址与student1.age的地址相同(事实上,结构体的实例后的名称地址与第一个成员的地址相同)

          3.指针加一偏移都是自身字节数的大小,结构体偏移+1是类成员字节数共大小,当然,这里面又涉及到字节对齐的概念(以后解释),有兴趣的朋友可以自行测试,这里给出我的测试代码,见下方

          4.现在可以类比数组名就是元素首地址了把(针对一维数组);二维及以上会单独讲解

          5.吃透了结构体,链表随心所欲使用

#include <iostream>

#include<stdio.h>

#include<string>

struct student {

int age;

std::string  name;

};

int main()

{

struct student student1;

student1.age = 20;

student1.name = "张飞";

std::cout << "我是student1的age:" << student1.age << std::endl;

std::cout << "我是student1的name:" << student1.name << std::endl;

std::cout << "下面是地址:" << std::endl;

std::cout << "我是student1的地址:" << &student1 << std::endl;

std::cout << "我是student1的age的地址:" << &student1.age << std::endl;

std::cout << "我是student1的name的地址:" << &student1.name << std::endl;

std::cout << "我是student1的地址偏移1个单位:" << &student1 + 1 << std::endl;

std::cout << "我是student1的age的地址偏移1个单位:" << &student1.age + 1 << std::endl;

std::cout << "我是student1的name的地址偏移1个单位:" << &student1.name + 1 << std::endl;

std::cout << "下面是根据地址取值:" << std::endl;

std::cout << "我是student1的地址加*取值:";

printf("%d\n",*(&student1));

std::cout << "我是student1的age的地址加*取值:" << *(&student1.age) << std::endl;

std::cout << sizeof(std::string) << std::endl;

return 0;

}

结构体你还有什么不懂吗?欢迎留言~~


启下 :拿到句柄以后,我们可以做什么,既然是内存值,那么我们是否可以修改??

下一章,小彩蛋,实现句柄的功能使用(简单而又好玩的程序设计)。


厨师真的挺好

2019-4-11

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,236评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,867评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,715评论 0 340
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,899评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,895评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,733评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,085评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,722评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,025评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,696评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,816评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,447评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,057评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,009评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,254评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,204评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,561评论 2 343

推荐阅读更多精彩内容