关于指针在Windows编程中的一些用法

来源:互联网 发布:淘宝规蜜入口在哪里 编辑:程序博客网 时间:2024/05/19 13:20

在计算机中,地址是一个内存标识符,由一个32位的数据储存。由于C语言提供了32位的数据让我们使用,这就扩展了指针的用途,使它变得更强大。最近在《Windows编程》一书看到一些和指针相关的代码,内容大致如下:

stuct ABOUTBOX_DATA {int iColor;int ifigure;};//主窗口回调函数static ABOUTBOX_DATA ad = {IDC_BLACK,IDC_RECT};// .....DialogBoxParam(hInstance,TEXT("AboutBox"),hwnd,NULL,&ad);//....//对话框回调函数static ABOUTBOX_DATA ad,*pad;pad = (ABOUTBOX_DATA *)lparam;ad = *pad;//over...

////////////////////////////////////////////////
本来对这些消息就很头疼,所以进行了相关的测试。
上面的代码的意图是:把结构体的地址赋给一个32位的数据,因为以前从来没有试过,所以好奇的尝试了一下。

#include <stdio.h>#include <windows.h>struct my{int a;int b;int c;};// 把指针赋值给长整型数据int main(int argc, char const *argv[]){WPARAM wparam;char string[10] = "point!!";my cat = {1,2,3};my *dog = NULL; void *none = NULL;long vary;wparam = (WPARAM)(&cat);vary = (long)(&cat);dog = (my *)vary;printf("cat address : %p\n",&cat);//地址是32位的数据,需要4个字节存储printf("cat address : %p\n",wparam);//WPARAM回调函数的一个参数,实际上也是32位的数据printf("cat address : %p\n",vary);// 只要是32位的数据,就提供了接受地址的可能printf("cat address : %p\n",dog );printf("data : %d %d %d\n",dog->a,dog->b,dog->c);// 输出正常// 事实证明,vary和wparam保存了地址,也可以当作指针使用了!!printf("data : %d %d %d\n",((my*)(vary))->a,((my*)(vary))->b,((my*)(vary))->c);printf("data : %d %d %d\n\n",((my*)(wparam))->a,((my*)(wparam))->b,((my*)(wparam))->c);// 指针就是这么强大,下面给个void类型的指针,其实和上面的是一样的,先把地址弄到手,//再在使用该地址的数据的时候需要进行强制类型转换,因为指针的类型决定了//操作系统从内存取多少数据,如果指针类型是void*,这是没意义的none = (void *)vary;printf("data : %d %d %d\n",((my*)(none))->a,((my*)(none))->b,((my*)(none))->c);// 演示一下字符串vary = (long)(string);printf("%s\n",(char *)string);// 演示一下错误的强制类型转换none = string;printf("%c\n",((int*)none)[0] );/// 输出的是't',这和系统有关。我的电脑中int是printf("int : %d",sizeof(int));//4个字节,char是一个字节,如果int是2个字节,输出的就是'i'printf("char : %d\n",sizeof(char));// 再以int类型为例printf("%d\n",((int*)none)[0] );// 由于int为四个字节,考虑到存储方式,系统直接把"poni"内存的值取出来printf("p : %X \no : %X\ni : %X\nn : %X\n",'p','o','i','n');//用作输出,下面给出字符的值printf("%d\n",0x6e696f70);// 验证一下return 0;}

附上运行结果
////////////////////////////////////////////////
就说这么多吧,就当是记录学习的知识,若有错误之处,望指点~

原创粉丝点击