二级指针

二级指针底层实现

坚强是说给别人听的谎言 提交于 2019-11-29 16:17:28
Pointers to Pointers,即二级指针。 一级指针和二级指针的值都是指向一个内存单元: 一级指针指向的内存单元存放的是源变量的值, 二级指针指向的内存单元存放的是一级指针的地址。 下面,我们通过如下代码展示二级指针的底层实现: #include <stdio.h> int main(){ int a = 777; int* b = &a; int** c = &b; *b = 888; **c = 999; printf("a=%d\n", 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\n" .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(

二级指针字符串

余生长醉 提交于 2019-11-26 17:22:17
//一级指针字符串 没有改变成功 char str1[20] ="notepad"; char str2[20] ="calc"; void change(char *str){ //函数有副本机制,会新建一个变量str来存储main函数中p传过来str1的首地址 printf("str in change: %p,%p\n",str,str2); //str in change: 00403008,0040301C str = str2; //改变新建指针变量str的地址,并没有影响main函数中p的地址 printf("change:%s,%p\n",str,str); //change:calc,0040301C } void main(){ char *p =str1; printf("p in main: %p,%p\n",p,str1); //p in main: 00403008,00403008 change(p); // change并没有改变p的指向 printf("after change: %s,%p\n",p,p); //after change: notepad,00403008 } //一级指针字符串    改变成功,改变其指向的内容 #include <string.h> char str1[20] ="notepad"; char str2[20]