C语言的指针

所谓的指针,其实就是一个类型。

如何解释这个呢?
首先来看
int i=3;

  1. int 是变量的类型
  2. i 是变量的名字
  3. 3 是变量的值

首先变量是存储在内存中,访问内存是需要地址,其次读取时需要知道内存存储的格式后才知道读取多少位内存。
也是分三步走

  1. 确认内存地址
  2. 知道内存格式
  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的内存地址的【类型】。
正如前面所说,变量都是需要存在内存中,同理指针也是存在内存中
如果用代码表示:

  1. int *i;
  2. printf("value is %d\n",i);
  3. printf("add value is %u\n",&i);
  4. 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);
}
这里&pointer.Address,实际上还是用了指针的意义,读取了address的地址后去读取的值 最终j的值是和i一样
posted @ 2023-08-09 22:55  ARM830  阅读(21)  评论(0编辑  收藏  举报