1、指针的基本操作
1.1、指针相加减
1、指针变量加减
void func() {
int *a;
a = (int *)100;
a ++; // 指针的自增自减和执行的数据类型的宽度有关!
printf("%d", &a); // 104
}
void func() {
int *a;
a = (int *)100;
int *b;
b = (int *)200;
int x = a - b;// 指针的运算单位是执行的数据类型的宽度!!
printf("%d", x); // 25
}
2、指针的指针加减
void func() {
int **a;
a = (int **)100;
a ++;
printf("%d", &a); // 108
}
1.2、指针的汇编
void func(){
int *a;
int b = 10;
a = &b;
}
0x102f1df90 <+0>: sub sp, sp, #0x10 ; =0x10
// 将 0x4+sp的地址赋值给x8寄存器 == int * a
0x102f1df94 <+4>: add x8, sp, #0x4 ; =0x4
// int b = 10
0x102f1df98 <+8>: mov w9, #0xa
// 将w9=10的内容存放到 0x4 + sp的内存中
-> 0x102f1df9c <+12>: str w9, [sp, #0x4]
// 将x8寄存器的值存放到了0x8+sp中
0x102f1dfa0 <+16>: str x8, [sp, #0x8]
0x102f1dfa4 <+20>: add sp, sp, #0x10 ; =0x10
0x102f1dfa8 <+24>: ret
指针
1.3、空指针异常
void func(){
char *a;
char c = *a;
}
0x102dedf94 <+0>: sub sp, sp, #0x10 ; =0x10
0x102dedf98 <+4>: ldr x8, [sp, #0x8]
// x8寄存器的地址值并不存在
-> 0x102dedf9c <+8>: ldrb w8, [x8]
0x102dedfa0 <+12>: strb w8, [sp, #0x7]
0x102dedfa4 <+16>: add sp, sp, #0x10 ; =0x10
0x102dedfa8 <+20>: ret
错误提示
1.4、二级指针
1、地址分析
void func(){
char **a;
char c = **a;
}
0x102271f90 <+0>: sub sp, sp, #0x10 ; =0x10
0x102271f94 <+4>: ldr x8, [sp, #0x8]
// 第一次取地址
-> 0x102271f98 <+8>: ldr x8, [x8]
// 第二次取地址
0x102271f9c <+12>: ldrb w8, [x8]
0x102271fa0 <+16>: strb w8, [sp, #0x7]
0x102271fa4 <+20>: add sp, sp, #0x10 ; =0x10
0x102271fa8 <+24>: ret
2、内存分析
void func(){
char **a;
char c = *(*(a + 2) + 2);
}
0x100cf1f90 <+0>: sub sp, sp, #0x10 ; =0x10
0x100cf1f94 <+4>: ldr x8, [sp, #0x8]
// *(a + 2) a为指针 0x10= 16= 2*8
-> 0x100cf1f98 <+8>: ldr x8, [x8, #0x10]
// *(a + 2) + 2其中 *(a + 2)为char类型相加
0x100cf1f9c <+12>: ldrb w8, [x8, #0x2]
0x100cf1fa0 <+16>: strb w8, [sp, #0x7]
0x100cf1fa4 <+20>: add sp, sp, #0x10 ; =0x10
0x100cf1fa8 <+24>: ret












网友评论