摘要: 基本解释 1、指针的本质是一个与地址相关的复合类型,它的值是数据存放的位置(地址);数组的本质则是一系列的变量。 2、数组名对应着(而不是指向)一块内存,其地址与容量在生命期内保持不变,只有数组的内容可以改变。指针可以随时指向任意类型的内存块,它的特征是“可变”,所以我们常用指针来操作动态内存。 3、当数组作为函数的参数进行传递时,该数组自动退化为同类型的指针。 问题:指针与数组 听说char a[]与char *a是一致的,是不是这样呢?......
摘要: 概述 joel spolsky认为,对指针的理解是一种aptitude,不是通过训练就可以达到的。虽然如此,我还是想谈一谈这个c/c++语言中最强劲也是最容易出错的要素。 鉴于指针和目前计算机内存结构的关联,很多c语言比较本质的特点都孕育在其中,因此,本篇和第六、第七两篇我都将以指针为主线,结合在实际编程中遇到的问题,来详细谈谈关于指针的几个重要方面。 指针类型的本质分析 1、指针的本质 指针的本质:一种复合的数据类型。下面我将以下面几个作为......
水滴石穿C语言之编译器引出的问题 基本解释 本节主要探讨c编译器下面两方面的特点所引发的一系列常见的编程问题。 对c文件进行分别编译:c程序通常由几个小程序(.c文件)组成,编译器将这几个小程序分别编译,然后通过链接程序将它们组合在一起形成一个目标代码。由于编译器每次只能编译一个文件,因此它不能立即检查需要几个源文件配合才能发现的错误。 对函数的参数与返回值建立临时变量 【相关文章:
微软C#产品经理对Richard的回应】 【扩展阅读:
《星际争霸》利用bwchart查看最真实】c编译器会对函数的参数建立临时参数,也可能会对函数的返回值隐含传递一个指针。因为这些临时变量的隐含性存在,使得在某些情况下,特别是有指针存在的时候,会引发一系列的问题。 c文件中所包含的头文件会与c语言一同编译 【扩展信息:
.NET专家Richard Grimes】 c语言中被包含的头文件是与.c文件一起编译的,头文件中的问题会反映到.c文件的编译中。 问题:c文件的分别编译 我有一个数组a定义在f1.c中,但是我想在f2.c中计算它的元素个数,用sizeof可以达到这个目的吗? 答案与分析: 答案是否定的,你没有办法达到目的,本质原因是sizeof操作符只是在“编译时(compile time)”起作用,而c语言的编译单位是每次单个.c文件进行编译(其它语言也都如此)。因此,sizeof可以确定同一个源文件中某个数组的大小,但是对于定义在另一个源文件中的数组它无能为力了,因为那已经是“运行时(run time)”才能确定的事情了。 一件事情要想做,总会有办法的,下面提供有三种可选的办法来解决这个问题: 1)、定义一个全局变量,让它记住数组的大小,在另外一个.c文件中我们通过访问这个全局变量来得到数组的大小信息(好像有点小题大做得不偿失^_^)。 2)、在某个.h文件中用宏定义数组的大小,例如#define array_size 50,然后在两个源文件中都包含这个.h文件,通过直接访问array_size来得到定义在不同.c文件中的数组的大小。 3)、设置数组的最后一个元素为特殊值,例如0,-1,null等,然后我们通过遍历数组来寻找这个特殊的结尾元素,从而判断数组的长度(这个办法效率低,也是笨笨的)。 问题:函数返回值隐含传递指针 下面的代码可以正常工作,但是在程序结束时会有一个致命错误产生。究竟是什么原因呢? 答案与分析: ...
下一页 摘要: 概述 在前面各章中,已多次使用过以“#”号开头的预处理命令。如包含命令# include,宏定义命令# define等。在源程序中这些命令都放在函数之外, 而且一般都放在源文件的前面,它们称为预处理部分。 所谓预处理是指在进行编译的第一遍扫描(词法扫描和语法分析)之前所作的工作。预处理是c语言的一个重要功能, 它由预处理程序负责完成。当对一个源文件进行编译时, 系统将自动引用预处理程序对源程序中的预处理部分作处理, 处理完毕自动进入对源程序的编译......