汇编的角度分析C语言的指针-02

1.关于地址符&:&是地址符,类型是其后面的类型加一个“*”,任何变量都可以使用&来获取地址,但不能用在常量上。

char a = 10;    
short b = 20;    
int c = 30;    

//&a   &b   &c的类型
//&a 是char* 类型       &b是short*类型     &c是int*类型

 

2、关于变量类型的反汇编

char a = 10;        
short b = 20;        
int c = 30;        
        
char* pa = &a;        
short* pb = &b;        
int* pc = &c;        
        
//&pa 是什么类型?  &pa是char**  类型的       
//&pb 是什么类型?  &pb是short** 类型的     
//&pc 是什么类型?  &pc是int**   类型的  

 

int* px;        
        
int** px2;        
        
int*** px3;        
        
int**** px4;        
        
//*(px) 是什么类型?    int类型的    
        
//*(px2) 是什么类型?   int*类型的    
        
//*(px3) 是什么类型?   int** 类型的  
        
//*(px4) 是什么类型?   int*** 类型的    

 

char a = 10;        
short b = 20;        
int c = 30;        
        
char* pa = (char*)&a;        
short* pb = (short*)&b;        
int* pc = (int*)&c;        
        
简写为:        
char* pa = &a;        
short* pb = &b;        
int* pc = &c;        

观察分析如下代码的反汇编:

char a = 10;            
short b = 20;            
int c = 30;            
            
char* pa = &a;            
short* pb = &b;            
int* pc = &c;            
            
char** ppa = (char**)&pa;            
short** ppb = (short**)&pb;            
int** ppc = (int**)&pc;            
            
简写为:            
char** ppa = &pa;            
short** ppb = &pb;            
int** ppc = &pc;            

反汇编:

 

   总结: 带“*”号的宽度都是四个字节,存放的是地址去掉一个“*”的变量的地址

 

 

3、观察如下代码的反汇编

int x,y;    
int* px;    
int** px2;    
int*** px3;    
    
x = 10;    
px = &x;    
px2 = &px;    
px3 = &px2;    
    
y = *(*(*(px3)));    
    

反汇编:

 

 总结:

  1、带“*”类型的变量,可以通过在其变量前加*来获取其指向内存中的存储值

  2、带“*”类型的变量前面加上*,类型是原来的类型减去一个*

 

 

 

 

posted @ 2021-01-04 12:19  heyhx  阅读(137)  评论(0编辑  收藏  举报