日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

c语言指针底层实现,C语言二级指针底层实现

發(fā)布時間:2025/4/16 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c语言指针底层实现,C语言二级指针底层实现 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

C語言中,Pointers to Pointers,即二級指針。

一級指針和二級指針的值都是指向一個內(nèi)存單元:

一級指針指向的內(nèi)存單元存放的是源變量的值,

二級指針指向的內(nèi)存單元存放的是一級指針的地址。

下面,我們通過如下代碼展示二級指針的底層實現(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的底層實現(xiàn)過程如下圖所示:

底層實現(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。