C语言中,Pointers to Pointers,即二级指针。

一级指针和二级指针的值都是指向一个内存单元:

一级指针指向的内存单元存放的是源变量的值,

二级指针指向的内存单元存放的是一级指针的地址。

下面,我们通过如下代码展示二级指针的底层实现:

#include

int main(){

int a = 777;

int* b = &a;

int** c = &b;

*b = 888;

**c = 999;

printf("a=%d

", a);

return 0;

}

假设:

栈的基地址为0,即rbp寄存器指向0;

栈的指针寄存器rsp指向地址为-32。

则,c语言语句**c = 999的底层实现过程如下图所示:

底层实现中,汇编语言首先找到c的值,通过c的值找到b的值,通过b的值找到a,并赋值999给a。

具体汇编代码如下:

.file "hlist.c"

.text

.section .rodata

.LC0:

.string "a=%d

"

.text

.globl main

.type main, @function

main:

.LFB0:

.cfi_startproc

pushq %rbp

movq %rsp, %rbp

subq $32, %rsp // rsp 减去 32

movq %fs:40, %rax

movq %rax, -8(%rbp)

xorl %eax, %eax

movl $777, -28(%rbp) // 地址为-28处的存储单元的值为777,即a赋值为777

leaq -28(%rbp), %rax // 将-28地址(a的地址)赋给%rax

movq %rax, -24(%rbp) // 将-28(64位,8字节)值给地址为-24的存储单元

leaq -24(%rbp), %rax // 将-24地址(b的地址)赋给%rax

movq %rax, -16(%rbp) // 将b的地址赋值给地址为-16的存储单元

movq -24(%rbp), %rax // 将b的值(a的地址)赋值给%rax

movl $888, (%rax) // a = 888

movq -16(%rbp), %rax // 将c的值(b的地址)赋值给%rax

movq (%rax), %rax // 将b的值赋值给%rax

movl $999, (%rax) // a = 999

movl -28(%rbp), %eax

movl %eax, %esi

leaq .LC0(%rip), %rdi

movl $0, %eax

call printf@PLT

movl $0, %eax

movq -8(%rbp), %rdx

xorq %fs:40, %rdx

je .L3

call __stack_chk_fail@PLT

.L3:

leave

.cfi_def_cfa 7, 8

ret

.cfi_endproc

.LFE0:

.size main, .-main

.ident "GCC: (Ubuntu 7.4.0-1ubuntu1~18.04.1) 7.4.0"

.section .note.GNU-stack,"",@progbits

c语言指针底层实现,C语言二级指针底层实现相关推荐

  1. C语言什么时候必须用到二级指针?(需要调用函数为一维空指针确定值的情况下,需要传入二维指针,也就是那个一维指针的指针)

    结论:需要调用函数为一维空指针确定值的情况下,需要传入二维指针,也就是那个一维指针的指针 例子:为空指针p开辟内存空间 1.不用二级指针(无法实现) #include <stdio.h> ...

  2. 【C 语言】结构体 ( 结构体中嵌套二级指针 | 为 结构体内的二级指针成员 分配内存 | 释放 结构体内的二级指针成员 内存 )

    文章目录 一.结构体中嵌套二级指针 1.结构体中嵌套二级指针 类型声明 2.为 结构体内的二级指针成员 分配内存 3.释放 结构体内的二级指针成员 内存 二.完整代码示例 一.结构体中嵌套二级指针 1 ...

  3. 【C 语言】多级指针 ( 在函数中生成 二级指针 | 通过传入的 三级指针 进行间接赋值 )

    文章目录 前言 一.在函数中生成 二级指针 ( 通过传入的 三级指针 进行间接赋值 ) 二.完整代码示例 前言 如果要 通过 函数形参 间接赋值 修改 nnn 级指针, 需要向函数中传入 n+1n + ...

  4. c语言const 修饰二级指针,C++中const修饰二级指针(从类型‘int**’到类型‘const int**’的转换无效)...

    先上代码: void func(const int ** arg) { } int main(int argc, char **argv) { int **p; func(p); return 0; ...

  5. 什么是二级指针和为什么要用二级指针

    二级指针那点事 现在让我们来看看什么什么是二级指针 node**c 一个关于指针小实验 下面做一个小实验 #include<stdio.h> #include<stdlib.h> ...

  6. c语言二级指针实现队列,C语言二级指针底层实现

    C语言中,Pointers to Pointers,即二级指针. 一级指针和二级指针的值都是指向一个内存单元: 一级指针指向的内存单元存放的是源变量的值, 二级指针指向的内存单元存放的是一级指针的地址 ...

  7. C语言中的二级指针和二维数组问题

    关于二级指针和二维数组两者差别很大,不可以直接用二级指针传递二维数组 首先来看看二维数组在内存中是如何组织的呢? 一维数组 T arr1 = new T[9]  二维数组T arr2 = new T[ ...

  8. C语言中二级指针的作用

    C语言中不存在引用,所以当你试图改变一个指针的值的时候必须使用二级指针. 1.当不用指针时,参数传入子函数的过程为值传递,子函数中修改的局部变量的值对原来的实参并没有影响. 2.当用一级指针时,参数传 ...

  9. C语言指针(函数指针数组,二级指针)

    int (*p[num])( char*,int,int );int (*(*p)[num])(int a); 上一篇博客最后的两个例子的答案分别是:函数指针数组,函数指针数组的指针. 函数指针数组指 ...

  10. 【C 语言】二级指针内存模型 ( 指针数组 | 二维数组 | 自定义二级指针 | 将 一、二 模型数据拷贝到 三 模型中 并 排序 )

    文章目录 一.指针数组 和 二维数组 数据 拷贝到 自定义二级指针 中 1.函数形参 设计规则 2.三种内存模型 对应 函数形参 指针退化规则 二.完整代码示例 一.指针数组 和 二维数组 数据 拷贝 ...

最新文章

  1. Cocos2d-x3.2 屏幕截图
  2. 基于VMware vSphere 5.0的服务器虚拟化实践(9)
  3. 9月9日项目群管理活动讨论
  4. 12月第四周安全回顾:双节期间微软忙补新漏洞,新Hash将测试
  5. sklearn:sklearn.GridSearchCV函数的简介、使用方法之详细攻略
  6. 自定义Chrome插件Vimium
  7. 转:char*, char[] ,CString, string的转换
  8. java中socket类_Java中的Socket的用法
  9. vc范例-操作mysql数据库_VC范例-操作MySQL数据库
  10. 前端传值后端接收不到_关于前端传参数,后台接收的问题
  11. mysql 初始化_MySQL安装与初始化
  12. java反编译工具jd-gui下载与使用
  13. 【python】conda配置python项目环境(Conda常用命令)
  14. 易优EyouCMS全套插件使用说明
  15. dflow入门2——Slices
  16. 2019年安徽大学ACM/ICPC实验室新生赛(公开赛)
  17. 【转载】梯度爆炸和梯度消失
  18. CANOE入门:CAPL语言实现诊断发送和接收
  19. 答题卡的计分方式_如何建立信用风险模型和记分卡
  20. oracle数据库latch,关于Oracle数据库latch: cache buffers chains等待事件

热门文章

  1. POJ 3320 Jessica's Reading Problem (尺取)
  2. POJ3267The Cow Lexicon
  3. 鲜为人知的C++ IO fstream流
  4. 使用 TensorFlow 的公司
  5. 报告显示:2018年北京人工智能相关产业达1500亿元
  6. Text模式和PDU模式短信的区别
  7. python函数图像加标签_tkinter(py3)更改图像标签,函数内部,实时
  8. 理解线程池中线程的复用原理
  9. 007_JavaScript关键字和保留字
  10. 077_html5拖放