变量和指针赋值在内存中的表现

在开发中,发现忘记了很基础的内容。所以学习记录下
C语言中会遇到指针和变量之间赋值的情况,*和&以及组合。如果不知道符号的真实含义,就会很容易遗忘甚至出错。

其实只要记住4点:

  • *表示取值符号
  • &表示取址符号
  • 变量保存值,指针指向地址。
    以如下代码举例
int *i_point;
int i=3;
i_point=&i;

内存总的表现如图

变量和指针赋值示意图

i 是整形变量,保存值,C语言i表示3,也就是指向存着3内存块,所以i输出是3。
&i &表示取址,所以&i就是0x101
i_point 是指针变量,保存地址,C语言i_point表示赋值变量的地址0x201,也就是i的地址0x201
&i_point 表示i_point取地址,也就是0x301
*i_point 表示i_point取值, i_point是i的地址&i,a的地址取值即i,也就是3
*&i_poinrt 表示i_point取地址后再取值,也就是&i_point上的值,地址: 0x301上的值为0x201
&*i_point 表示i_point取值后再取地址,也就是* i_point(或a)的地址,也就是0x101

代码如下:

#include 
int main(){
    // 变量,值,指针在初始化时候的意义
    int i=3;
    // 1.变量赋值 在内存中创建了一个地址0x101存放值3,然后再创建一个地址0x201存放0x101。
    printf("整形变量的值:%d,整形变量的地址:%p\n",i,&i);
    // 2.指针赋值 在内存中创建了一个地址0x301存放地址0x201。
    int *i_point;
    i_point=&i;
    // 只要记住:*表示取值符号,&表示取址符号,变量保存值,指针保存地址。
    // i  是整形变量,保存值,C语言i表示3,也就是指向存着3内存块,所以i输出是3。
    printf("i  是整形变量,保存值,C语言i表示3,也就是指向存着3内存块,所以i输出是%d\n",i);
    // &I  &表示取址,所以&i就是0x101
    printf("&表示取址,所以&i就是%p\n",&i);
    // i_point 是指针变量,保存地址,C语言i_point表示赋值变量的地址0x201,也就是i的地址0x201
    printf("i_point 是指针变量,保存地址,C语言i_point表示赋值变量的地址%p,也就是i的地址%p\n",i_point,&i);
    // &i_point 表示i_point取地址,也就是0x301
    printf("&i_point 表示i_point取地址,也就是%p\n",&i_point);
    // *i_point 表示i_point取值,i_point是i的地址&i,a的地址取值即i,也就是3
    printf("*i_point 表示i_point取值,i_point是i的地址&i,&i取值即i,也就是%d\n",*i_point);
    // *&i_poinrt 表示i_point取地址后再取值,也就是&i_point上的值,地址: 0x301上的值为0x201
    printf("*&i_poinrt 表示i_point取地址后再取值,也就是&i_point上的值,地址: %p上的值为%p\n",&i_point,*&i_point);
    // &*i_poinrt表示i_point取值后再取地址,也就是* i_point的地址,值的地址,也就是0x101
    printf("&* i_poinrt表示i_point取值后再取地址,也就是* i_point(或a)的地址,也就是%p\n",&*i_point);
    return 0;
}

你可能感兴趣的:(变量和指针赋值在内存中的表现)