swift初探之输入输出函数 inout

定义:可以在函数内部修改外部实参的值

首先我们写一个输入输出函数

定义输入输出函数

上面是定义一个交换的函数,swapValues的两个函数使用了inout关键字,传入参数时需要在参数前面加上&。

调用swapValues函数使得外部num1、num2的值进行修改。这里就会有个疑问,为什么外部额变量会被修改,是通过什么样的方式进行修改。这里我会想到c语言里面把地址传递进去,函数对地址里面的内容进行修改。但是我在网上查阅了一些资料感觉不靠谱。后来看了一些视频,找了一些资料。找到了最好的方法就是查看汇编代码进行验证。

    我是一点汇编的基础都没有,都是现学现卖。有不对的地方多多指教。

首先把多余的代码去掉,不然汇编里面会有一些不必要的代码进行混淆。对于像我这样的小白,看起来特别的繁琐。其次在调用函数的地方打个断点。运行起来进入到汇编的页面。

进入到汇编页面,看起来一头雾水。但是第一眼就能看到$0xa和$0x14,这不就是16进制的10和20么。

我们可以通过0x9844(%rip)算出10存储在内存中的位置为0x10000C310,我们可以查看内存中的存储

10和20都存储在内存中,接下来断点走到下一个断点。

重点来了,leaq命令是把0x97f9(%rip)地址传给rdi、0x97fa(%rip)地址传给rsi。leaq当中的q是单位,是8个字节。

0x97f9(%rip)和0x97fa(%rip)这两个算出来的地址就是存储10和20的地址。读者可以自行验证。

callq是调用函数,在控制台输入si进入callq所对应的函数。

上图就是swapValues函数的汇编。首先是初始化一段内存,rdi、rsi是外面出入进来的参数。就是num1和num2的地址。取出rdi内存存储的地址所对应的值给到rax,取出rsi内存存储的地址所对应的值给到rcx,之后把rcx的值赋给rdi内存存储的地址所对应的内存,在把rax的值赋给rsi内存存储的地址所对应的内存。这里就是我们函数里面的交换。

所以这里就看出看inout关键字本质是通过地址传递进行值修改的。但是注意的是传谁的地址还是有区别的。

你可能感兴趣的:(swift初探之输入输出函数 inout)