A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

我们定义一个变量的时候如,int a;变量a相当于一个映射元素,被编译器内部解释为一个地址,但我们不能在源代码层次上不能直接使用这个地址,必须用&a这种形式才能取得地址,于是编译器看到&a将会在编译时候确定a变量的地址后并返回这个地址。也就是说变量名在编译期将会绑定一块内存,这块内存的名字是a,但是这块内存有自己的地址(首地址)。指针变量也是一样比如,int *b;这个时候指针变量b也是一个映射元素,编译期间也会内存中的一块内存给一个别名,这个别名很适合我们去使用,内存的分配是编译器决定的,比我们人为的分配地址大大简化了难度。但编译器内部肯定会提供变量名到地址的映射。函数名和变量名一样,都是标识符,也都是一种映射元素,会提供变量名或函数名到绑定的内存块的一种映射。所以你的一个函数调用,比如f();编译器将根据f这个映射元素所绑定的内存找到实际存储的代码并执行,也就是说函数名将会在调用时候转化为一个函数指针。如果f是一个函数指针呢,我们可以直接用f();形式调用,这个时候编译器只需要根据函数指针指向的代码块直接调用。当然还有一种用函数指针调用函数的形式:(*f)();这个时候编译器将会先执行*f,结果是函数名。然后编译器将函数名这个映射元素转化为函数指针,然后执行代码。需要注意的是:执行一个函数调用,编译器最终需要的是一个函数指针。

1 个回复

倒序浏览
写的很好,学习学习!:):)
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马