设置
案例分析
修改1:main中调用
int sum(int a, int b){
return a + b;
}
int main(int argc, char * argv[]) {
sum(1, 2);
}
修改2:打印sum的结果
int sum(int a, int b){
return a + b;
}
int main(int argc, char * argv[]) {
int a = sum(1, 2);
printf(@"%d", a);
}
指针
指针分析
-
问题:a++之后,a是多少?
-
是104,因为指针的自增自减和指向的数据类型宽度有关,即因为a指向的数据是int,int的宽度是4个字节
-
修改1、如果将int改成char,结果是多少呢?
-
因为a指向的数据是char,char的宽度是1个字节
void func(){
char *a;
a = (char *)100;
a++;
printf("%d", a);
}
<!--打印结果-->
101
- 指针和指针求差值
指针的反汇编
指针的反汇编分析
运行发现是可以的,所以有以下对等关系:
- 运行发现也是可以的
运行发现,崩溃报错:原因是以0作为地址取值,以下是对应的汇编分析
查看汇编代码:
- 查看汇编:
- 以下是func函数的汇编,此时d是取
[x8+0x4]
- 地址的值,因为int是4个字节,
0x4
- 就是
int类型的步长
指针的基本用法-04
-
查看汇编,此时d是取[x8+0x8]地址的值,因为int*是一个指针,占8个字节,0x8就是int*类型的步长
指针的基本用法-05
-
int** 需要拉伸多少个字节?
实际需要3x8=24字节,由于是汇编是16字节对齐,所以需要sub减0x20 -
此时多增加一个int* p2 ,栈空间拉伸多少字节?
发现仍然是0x20指针的基本用法-06
-
再多增加一个char c1呢?
此时超过了32,所以需要再多拉伸16字节指针的基本用法-07
有以下代码
void func(){
int **p1;
int c = **p1;
}
2、多级指针加法运算
void func(){
char **p1;
// char c = p1+2; //此时的+2是 +0x10(执行数据类型是char*)
char c = *(*(p1 + 2) + 2);//最外层的+2,是加0x2(执行数据类型是char)
}
-
p1[1] 此时的1表示0x8(类型是char*)
-
p1[1][2] 此时的2表示 0x2(类型是char)
多级指针-02
从汇编结果来看p1[1][2]与*(*(p1 + 2) + 2)是等价的
if-else比大小,因为类型是可以相互转换的