| 注7:你肯定是一个很负责任的人,而且也知道自己到底在干什么。你难道不是吗?:)所以你一定也知道,做一件事是要付出成本的,当然也应该获得多于成本的回报。 我很喜欢经济学,经济学的一个基础就是做什么事情都是要花成本的,即使你什么事情也不做。时间成本,金钱成本,机会成本,健康成本……可以这样说,经济学的根本目的就是用最小的成本获得最大的回报。 所以我们在自己的程序中最好避免这种邪恶的写法,不要让自己一时的智力过剩带来以后自己和他人长时间的痛苦。用韦小宝的一句话来说:“赔本的生意老子是不干的!” 但是对邪恶的了解是非常必要的,这样当我们真正碰到邪恶的时候,可以免受它对心灵的困扰! 对于指向同一个数组不同元素的指针,它们可以做减法,比如int* p = q i;p-q的结果就是这两个指针之间的元素个数。i可以是负数。但是请记住:对指向不同的数组元素的指针,这样的做法是无用而且邪恶的! 对于所谓的n维数组,比如int a[2][3];你可以得到数组第一个元素的地址a和它的大小。*(a 0)(也即a[0]或者*a)就是第一个元素,它又是一个数组int[3],继续取得它的第一个元素,*(*(a 0) 0)(也即a[0][0]或者*(*a)),也即第一个整数(第一行第一列的第一个整数)。假如采用这种表达式,就非常的笨拙,所以a[0][0]记法上的简便就非常的有用了!简单明了! 对于数组,你只能取用在数组有效范围内的元素和元素地址,不过最后一个元素的下一个元素的地址是个例外。它可以被用来方便数组的各种计算,非凡是比较运算。但显然,它所指向的内容是不能拿来使用和改变的! 关于数组本身大概就这么多,下面简要说一下数组和指针的关系。它们的关系非常暧昧,有时候可以交替使用。 比如 int main(int args, char* argv[])中,其实参数列表中的char* argv[]就是char** argv的另一种写法。因为在C语言中,一个数组是不能作为函数引数(argument)【注8】直接传递的。因为那样非常的损失效率,而这点违反了C语言设计时的基本理念——作为一门高效的系统设计语言。 注8:这里我没有使用函数实参这个大陆术语,而是运用了台湾术语,它们都是argument这个英文术语的翻译,但在很多地方中文的实参用的并不恰当,非常的勉强,而引数表示被引用的数,很形象,也很好理解。很快你就可以像我一样适应引数而不是实参。 dereferance,也就是*运算符操作。我也用的是提领,而不是解引用。 我认为你一定智勇双全:既有宽容的聪明,也有面对新事物的勇气!你不愿意承认吗?:) 所以在函数参数列表(parameter list)中的数组形式的参数声明,只是为了方便程序员的阅读!比如上面的char* argv[]就可以很轻易的想到是对一个char*字符串数组进行操作,其实质是传递的char*字符串数组的首元素的地址(指针)。其它的元素当然可以由这个指针的加法间接提领(dereferance)【参考注8】得到!从而也就间接得到了整个数组。 但是数组和指针还是有区别的,比如在一个文件中有下面的定义: char myname[] = “wuaihua”; 而在另一个文件中有下列声明: extern char* myname; 它们互相是并不熟悉的,尽管你的本义是这样希望的。 它们对内存空间的使用方式不同【注9】。 对于char myname[] = “wuaihua”如下 myname w u a i h u a \0 对于char* myname;如下表 myname \|/ w u a i h u a \0 注9:可以参考Andrew Konig的《C陷阱与缺陷》4.5节。 改变的方法就是使它们一致就可以了。 char myname[] = “wuaihua”; extern char myname[]; 或者 char* myname = “wuaihua”;//C 中最好换成const char* myname = “wuaihua”。
|
| 共7页: 上一页 [1] [2] 3 [4] [5] [6] [7] 下一页 |
评论加载中…