C语言的指针
所谓的指针,其实就是一个类型。
如何解释这个呢?
首先来看
int i=3;
- int 是变量的类型
- i 是变量的名字
- 3 是变量的值
首先变量是存储在内存中,访问内存是需要地址,其次读取时需要知道内存存储的格式后才知道读取多少位内存。
也是分三步走
- 确认内存地址
- 知道内存格式
- 读取内存
此时 我们只需要结合上面的int i=3
就可以一一对照了。
- int 是 内存格式【读取多少位】
- i 是 内存地址
- 3 是内存根据地址和格式读取后的值。
为什么说i
是内存地址呢, 在代码中可是直接使用i也可以得到i的值...
实际上我们得分两步理解程序中使用非指针时的变量的过程【大致】
- 第一步 知道内存位置
- 第二步 读取内存格式
而这些都是在使用i
的这一刻都完成了。
如果我们详细的拆解那么就是:
点击查看伪代码
int add=GetAddress(i);
int typelen=GetTypeLen(i);
int value=GetValue(add,typelen);
而指针的*符号,&符号,就是这些过程的代替。
*符号是1,2,3
的全部过程
&符号是1
的过程
此时,我们回到指针为什么是个类型的问题。
int *pointer;
这定义一个了指针
是 存储一个内存类型为int的内存地址的【类型】。
正如前面所说,变量都是需要存在内存中,同理指针也是存在内存中
如果用代码表示:
int *i;
printf("value is %d\n",i);
printf("add value is %u\n",&i);
printf ("get store value in addree %d \n",*i);
2
表示 用【普通变量】的提取过程 直接根据内存地址提取int的长度的内存后转换的值
3
&是取地址符号,也就是直接i的地内存中位置
4
*号是直接读取i的值,也就是i中保存的内存地址的int长度的内存后的转换的值。
说白了
*
就是读内存,按照当前指针的类型读取指定长度
&
是获取地址
最后 如果不用指针来表达这些事情 也可以是
点击查看代码
#include <stdio.h>
#include <windows.h>
struct Pointer
{
int Address;
int TypeLen;
} pointer;
int main(int argc, char const *argv[])
{
pointer;
int i = 3199;
pointer.Address = &i;
pointer.TypeLen = sizeof(i);
int j=0;
int outval = ReadProcessMemory(GetCurrentProcess(), pointer.Address, &j, sizeof(i), NULL);
}