Re: [问题] 函数指标

楼主: purpose (秀才遇到肥宅兵)   2015-03-22 21:02:43
: : fptr=max; //fptr=&max;
: 1. 自动转型! 请问是什么type自动转型成什么type?
: 想法:
: max 自动转型成pointer
: 也就是说compiler 做了fptr=(int(*)(int,int))max;
现在假设你正在观看一份原始码...
那么 1234 是什么?
一个“literal”,一笔资料,不确定资料型态,默认值好像是当成 int。
所以 (int *) 1234 是什么?
把 literal 做型态转换 (type conversion),而且是
显式的型态转换 (explicit conversion),也就是做 cast 这个动作,使得
1234 的资料型态,必然是一种 (int *)。
那 (int *) 是什么?
代表该资料是指标的其中一种。
那指标是什么?
从占用的内存空间来看,指标是一种在 32-bit 机器占用 4 bytes,
在 64-bit 机器占用 8 bytes 的资料型态。
从 + 1 这件事来看,如果是 int 就是单纯递增一个单位,可是指标的 + 1
会递增多少单位,要看是指向的东西是什么型态。比如 (double *) 做 + 1
就是递增八个单位。
从白冰冰的角度来看,指标他不是好人,不是坏人,他根本不是人。
所以,它不是一种变量 (variable),不是一种常数 (cosntant),也不是
一种常值 (literal),而根本是一种 type。
※ 变量跟常数,会用 symbol 表示,比如用英文单字 bar;
常值不使用 symobl 表示,直接将资料写入原始码,比如 3.14。
引述 C++ Primer 的解释:
A pointer is a compound type that “points to” another type.
阵列名称是不是指标?
这是一个对很多人来说讨论到烂的问题,但我需要重提一次,以便跟函数对比。
编译器,对于阵列名称的认定,会看当时的使用情景。
九成以上的状况当然是...
把阵列的起始位址取出来,然后转换资料型态,变成一种指标。
如果碰到少数情形,比如配合 sizeof 运算子时,上面那种转成指标的转型
就不会进行,而是会考虑整个阵列的大小有多大,再传回结果。
函数名称是不是指标?
如果从阵列的情况来推论,函数名称也应该要视使用情景来决定。
但我不知道什么情况是特例,也许有,也许没有
我个人都是无脑的认定函数名称 == 函数起始位址。
在这种情况下,该不该把函数认定成资料的一种?还是说函数是函数,
资料归资料?
函数没有资料型态?资料型态里面也没有函数?
假设资料型态里没有函数,那么函数名称的处理是...编译器透过函数名称,
创造出一笔资料,其型态为函数指标。因此回答原 PO... max 没有被自动转型。
假设资料型态里面有“函数”这种型态,那么 max 的原始型态是函数,
当 max 作为变量初始化、赋值运算的算子时,则 max 会自动转型,
变成“函数指标”这种资料型态。
作者: wenyonba (射后不理很XX啊!!!!)   2015-03-22 21:09:00
推推,对于阵列名称部分可以很容易看懂,函数部分虽然大概知道想讲什么,但是还是很模糊的感觉XD
作者: Feis (永远睡不着 @@)   2015-03-22 21:14:00
从标准的角度来看, 这些讲法不尽正确. C 跟 C++ 也不尽相同
作者: jono103 (不说对不起)   2015-03-23 00:10:00
感谢p大回复 你的说法可以接受 但F大又说不一定正确@@?可以请F大赐教吗? 或给个方向或哪些书 非常感激

Links booklink

Contact Us: admin [ a t ] ucptt.com