首页 > 其他分享 >C语言的指针

C语言的指针

时间:2023-08-09 23:00:27浏览次数:61  
标签:读取 int C语言 内存 内存地址 pointer 指针

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

如何解释这个呢?
首先来看
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的地址后去读取的值

标签:读取,int,C语言,内存,内存地址,pointer,指针
From: https://www.cnblogs.com/T-ARF/p/17619099.html

相关文章

  • C语言驱动开发之内核解锁与强删文件
    在某些时候我们的系统中会出现一些无法被正常删除的文件,如果想要强制删除则需要在驱动层面对其进行解锁后才可删掉,而所谓的解锁其实就是释放掉文件描述符(句柄表)占用,文件解锁的核心原理是通过调用ObSetHandleAttributes函数将特定句柄设置为可关闭状态,然后在调用ZwClose将其文件关闭......
  • 萌新学习c语言过程
    今天把三子棋的代码写的差不多了,有些地方不尽人意感觉有时候还是有点迷。......
  • C语言驱动开发之内核解锁与强删文件
    在某些时候我们的系统中会出现一些无法被正常删除的文件,如果想要强制删除则需要在驱动层面对其进行解锁后才可删掉,而所谓的解锁其实就是释放掉文件描述符(句柄表)占用,文件解锁的核心原理是通过调用ObSetHandleAttributes函数将特定句柄设置为可关闭状态,然后在调用ZwClose将其文件关闭......
  • 我的第十三次C语言练习
    //intmain(void)//{// charname1[40];// charname2[40];// printf("Mynameis");// scanf("%s%s",name1,name2);//MynameisAngelaPlains// printf("Hello%s%s",name1,name2);// HelloAngelaPlains// return0;//}今天先是......
  • 函数指针、std::function、std::bind
    函数指针、std::function、std::bind函数指针:C++语法中可以直接将函数名作为指针,voidfun(inta,intb);在这个函数声明中,函数指针即为fun,传入要被调用的地方时只需要传入fun就可以。但是这个函数指针是什么类型呢?需要明确函数指针类型及其写法,我们才能在要调用函数的形......
  • c语言批量修改文件名
    #include<stdio.h>#include<io.h>#include<string.h>intscandir(void){ charpath[200]="D:\\test"; charpathcpy[100]; charsubstr[100]="第";//该字符串前的文字都去掉 char*new_filename; charnew_filepath[100]; intre......
  • C语言学习笔记(八)指针详解
    指针详解arr[i]=*(arr+i)=*(p+i)=p[i]字符指针charp*intmain(){ charch='w'; char*pc=&ch; return0;}intmain(){ chararr[]="abcdefg"; char*pc=arr; printf("%s\n",arr); printf("%s\n",pc); ......
  • LeetCode 16. 3Sum Closest 双指针+排序
    Givenanintegerarraynumsoflengthnandanintegertarget,findthreeintegersinnumssuchthatthesumisclosesttotarget.Returnthesumofthethreeintegers.Youmayassumethateachinputwouldhaveexactlyonesolution.Solution先将原数组排序,然......
  • C语言听课笔记
    %1f——double;%c——char;%p——&a;%s——char[]求两个数的较大值#include<stdio.h>int main(){ int num1=10; int num2=20; if (num1>num2)    printf("较大值是:%d\n",num1); else    printf("较大值是:%d\n",num2); return 0;}#include<stdio.h&......
  • 【C语言基础练习】
    学习来源:https://www.bilibili.com/video/BV1q54y1q79w/?spm_id_from=333.337.search-card.all.click1.判断一个数是否为奇数。#include<stdio.h>intmain(){ inta; printf("请输入需要判断的数字\n"); scanf_s("%d",&a); if(a%2==1) printf("奇数\......