c语言指针底层实现,C语言二级指针底层实现
C語言中,Pointers to Pointers,即二級指針。
一級指針和二級指針的值都是指向一個內(nèi)存單元:
一級指針指向的內(nèi)存單元存放的是源變量的值,
二級指針指向的內(nèi)存單元存放的是一級指針的地址。
下面,我們通過如下代碼展示二級指針的底層實(shí)現(xiàn):
#include
int main(){
int a = 777;
int* b = &a;
int** c = &b;
*b = 888;
**c = 999;
printf("a=%d
", a);
return 0;
}
假設(shè):
棧的基地址為0,即rbp寄存器指向0;
棧的指針寄存器rsp指向地址為-32。
則,c語言語句**c = 999的底層實(shí)現(xiàn)過程如下圖所示:
底層實(shí)現(xiàn)中,匯編語言首先找到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字節(jié))值給地址為-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
總結(jié)
以上是生活随笔為你收集整理的c语言指针底层实现,C语言二级指针底层实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c语言 五子棋 悔棋代码,跪求C语言五子
- 下一篇: android自定义下载框架,Andro