设置
案例分析
修改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
指针的反汇编
指针的反汇编分析
查看汇编代码:
[x8+0x4]
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)是等价的