c语言指针底层实现,C语言二级指针底层实现
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语言二级指针底层实现相关推荐
- C语言什么时候必须用到二级指针?(需要调用函数为一维空指针确定值的情况下,需要传入二维指针,也就是那个一维指针的指针)
结论:需要调用函数为一维空指针确定值的情况下,需要传入二维指针,也就是那个一维指针的指针 例子:为空指针p开辟内存空间 1.不用二级指针(无法实现) #include <stdio.h> ...
- 【C 语言】结构体 ( 结构体中嵌套二级指针 | 为 结构体内的二级指针成员 分配内存 | 释放 结构体内的二级指针成员 内存 )
文章目录 一.结构体中嵌套二级指针 1.结构体中嵌套二级指针 类型声明 2.为 结构体内的二级指针成员 分配内存 3.释放 结构体内的二级指针成员 内存 二.完整代码示例 一.结构体中嵌套二级指针 1 ...
- 【C 语言】多级指针 ( 在函数中生成 二级指针 | 通过传入的 三级指针 进行间接赋值 )
文章目录 前言 一.在函数中生成 二级指针 ( 通过传入的 三级指针 进行间接赋值 ) 二.完整代码示例 前言 如果要 通过 函数形参 间接赋值 修改 nnn 级指针, 需要向函数中传入 n+1n + ...
- c语言const 修饰二级指针,C++中const修饰二级指针(从类型‘int**’到类型‘const int**’的转换无效)...
先上代码: void func(const int ** arg) { } int main(int argc, char **argv) { int **p; func(p); return 0; ...
- 什么是二级指针和为什么要用二级指针
二级指针那点事 现在让我们来看看什么什么是二级指针 node**c 一个关于指针小实验 下面做一个小实验 #include<stdio.h> #include<stdlib.h> ...
- c语言二级指针实现队列,C语言二级指针底层实现
C语言中,Pointers to Pointers,即二级指针. 一级指针和二级指针的值都是指向一个内存单元: 一级指针指向的内存单元存放的是源变量的值, 二级指针指向的内存单元存放的是一级指针的地址 ...
- C语言中的二级指针和二维数组问题
关于二级指针和二维数组两者差别很大,不可以直接用二级指针传递二维数组 首先来看看二维数组在内存中是如何组织的呢? 一维数组 T arr1 = new T[9] 二维数组T arr2 = new T[ ...
- C语言中二级指针的作用
C语言中不存在引用,所以当你试图改变一个指针的值的时候必须使用二级指针. 1.当不用指针时,参数传入子函数的过程为值传递,子函数中修改的局部变量的值对原来的实参并没有影响. 2.当用一级指针时,参数传 ...
- C语言指针(函数指针数组,二级指针)
int (*p[num])( char*,int,int );int (*(*p)[num])(int a); 上一篇博客最后的两个例子的答案分别是:函数指针数组,函数指针数组的指针. 函数指针数组指 ...
- 【C 语言】二级指针内存模型 ( 指针数组 | 二维数组 | 自定义二级指针 | 将 一、二 模型数据拷贝到 三 模型中 并 排序 )
文章目录 一.指针数组 和 二维数组 数据 拷贝到 自定义二级指针 中 1.函数形参 设计规则 2.三种内存模型 对应 函数形参 指针退化规则 二.完整代码示例 一.指针数组 和 二维数组 数据 拷贝 ...
最新文章
- Cocos2d-x3.2 屏幕截图
- 基于VMware vSphere 5.0的服务器虚拟化实践(9)
- 9月9日项目群管理活动讨论
- 12月第四周安全回顾:双节期间微软忙补新漏洞,新Hash将测试
- sklearn:sklearn.GridSearchCV函数的简介、使用方法之详细攻略
- 自定义Chrome插件Vimium
- 转:char*, char[] ,CString, string的转换
- java中socket类_Java中的Socket的用法
- vc范例-操作mysql数据库_VC范例-操作MySQL数据库
- 前端传值后端接收不到_关于前端传参数,后台接收的问题
- mysql 初始化_MySQL安装与初始化
- java反编译工具jd-gui下载与使用
- 【python】conda配置python项目环境(Conda常用命令)
- 易优EyouCMS全套插件使用说明
- dflow入门2——Slices
- 2019年安徽大学ACM/ICPC实验室新生赛(公开赛)
- 【转载】梯度爆炸和梯度消失
- CANOE入门:CAPL语言实现诊断发送和接收
- 答题卡的计分方式_如何建立信用风险模型和记分卡
- oracle数据库latch,关于Oracle数据库latch: cache buffers chains等待事件