操作变量实际是通过地址来操作内存空间


  因为前面已经写了很多关于指针的见解,我之前写过,指针是通过地址来操作它所指向的空间,就是一个指针你得给它分配一个可用的内存空间的地址,这样你才可以去操作这块地址;这个地址是这么来的,你可以将它指向一个变量或者手工分配等;

  那么这个地址有是什么,我的理解是cpu的内存编号,也就是说关于内存四区的编号,这个编号分的特别细致,应该是一个字节一个编号;

  然后我们的变量相当于一个门牌号,通过这个门牌号来找到这个地址;也就是我们可以通过 & 取出这个变量的地址编号;

  那么也就是说我们实际上是通过地址编号来操作内存空间的,在换句话说就是,我们也可以直接通过地址编号直接操作内存空间;

  那么下面我们来做一下实验:

#include 
#include <string.h>
#include 

int main()
{
    int a = 0;
    int *b = NULL;

    a = 1;//给a赋值
    printf("&a:%d\n",&a);//打印a的地址//2686744
    printf("a:%d\n",a);

    system("pause"):
    return 0;
}

  在这里我们取出a的地址,我们可以发现是2686744(这个在不同的电脑或者编译器上应该是不一样的,但是道理都是一样的);然后我们知道什么样的指针类型才能操作什么样的变量;也就是说如果我们想要操作内存空间我们需要知道这到这块空间是什么类型的吧!

  也就是说a是int类的变量,然后这个地址就和指针是一样的了;我们需要声明它的类型 (int *)2686744,而指针是如何操作内存空间的加一个 * 号;即*((int *)2686744)

  代码如下:

int main()
{
    int a = 0;
    int *b = NULL;
   
    a = 1;//直接赋值
    printf("&a:%d\n",&a);//打印a的地址//2686744
    printf("a:%d\n",a);

    printf("&c:%d\n",&c);//2686739
    printf("%c\n",c);

    //间接赋值
    //1.通过内存编号
    *((int *)2686744) = 2;
    printf("a:%d\n",a);

    //2.通过指针
    b = &a;
    *b = 3;
    printf("&b:%d\n",&b);
    printf("b:%d\n",b);//我们发现b和a的地址一样 和&b不一样
    printf("a:%d *b:%d\n",a,*b);//a = *b
    return 0;
}

  然后我们可以发现通过内存编号成功改变数值,就和通过指针是一样的,也就是说我们其实是通过地址来操作内存空间的;也就是编译器会吧我们写的代码转换成通过内存编号来操作空间;

  至于变量名和内存空间的关系,下次再写吧!

C