align=center></P>) T! _" S* F+ c/ U/ [
><B>3 </B><B>C</B><B>程序设计模型</B>(The C Programming Model)<B></B></P>
> </P>
> 计算机中有一个被广泛使用的基本概念一直是保持固定不变的:存储区(memory)是word或byte的序列,通过被称为地址的整数来进行索引。现代的计算机——即近20年内设计的计算机——都倾向于对函数调用使用栈的方法进行直接的支持;而更为甚之的是,所有流行的机器都有一些诸如输入、输出之类的重要设施,这些设施与传统的面向word或byte的计算和存储模型并不能很好的相适应。这些设施总是需要通过特殊的机器指令或者特别的语义来访问存储区。而从一个高级语言的角度来看,不管用那种方法,对这些设施的使用者而言都是麻烦的,而且与特定机器的体系结构有关。</P>
> 在对这方面的处理上,C是最为成功的一门语言,它所提供的程序设计模型能够与机器包含的模型很好的相适应。C提供独立于机器体系结构的、语言层面的方法;这种方法能与关键的硬件方法相对应:字符用byte,整数用word,指针用于地址,函数用于对程序的抽象。C还摒弃了一些在这方面具有约束性的语言特性,使得程序员可以在必要时亲自操纵特定的硬件层细节。在那些依赖并利用机器的某些特定设计而得到益处的领域里,C就显得相对更容易学和更容易使用一些。更何况,C是如此容易实现——它几乎已经变得随处可得了。</P>% t5 R7 {, v; T7 {5 R+ _
> </P>* w4 Y" _9 I6 `% a* W+ g4 W
><B>3</B><B>.</B><B>1 </B><B>数组和指针</B>(Arrays and Pointers)<B></B></P>
><FONT color=#0000ff>在</FONT><FONT color=#0000ff>C中,一个数组只是一片存储区域。例如:</FONT></P>
align=left>int v[10]; // 10个int型变量的数组</P>8 U/ D( N. n2 L7 d( {. Q
align=left>v[3] = 1; // 将1赋值给v[3]</P>8 O6 T# B. x# Y, F) C+ R
>int x = v[3]; // 从v[3]读取元素值</P>
>表示下标的标记 [] 用在声明中,表示声明的对象是数组;用在表达式中,表示数组的元素。</P>4 z! o B* H: v5 \# x- n0 E6 c6 g {
>一个C语言中的指针是指一个变量,它存放着某个存储位置的地址。例如:</P>' _) s6 ~0 G9 ]: i/ y# n
>int* p; // p是一个指向int型对象的指针</P>
>p = &v[7]; // 将v[7]的地址赋给p</P>
>*p = 4; // 通过p来向v[7]写入数据</P>% L3 A. S6 w1 o; L
>int y = *p; // 通过p来读取v[7]的数据<p>4 {9 T' R* u+ v; ?, B1 N: A
> 指针的提领(dereference,“指向”的意思)标记 * 用在声明中,表示声明的对象是指针;用在表达式中,表示取指针所指向的那个元素。</P>4 ~' {- F; b' k3 `& a
>这可以用下图表示:</P>
align=center><v:shapetype><v:stroke joinstyle="miter"></v:stroke><v:formulas><v:f eqn="if lineDrawn pixelLineWidth 0 "></v:f><v:f eqn="sum @0 1 0 "></v:f><v:f eqn="sum 0 0 @1 "></v:f><v:f eqn="prod @2 1 2 "></v:f><v:f eqn="prod @3 21600 pixelWidth "></v:f><v:f eqn="prod @3 21600 pixelHeight "></v:f><v:f eqn="sum @0 0 1 "></v:f><v:f eqn="prod @6 1 2 "></v:f><v:f eqn="prod @7 21600 pixelWidth "></v:f><v:f eqn="sum @8 21600 0 "></v:f><v:f eqn="prod @7 21600 pixelHeight "></v:f><v:f eqn="sum @10 21600 0 "></v:f></v:formulas><v:path connecttype="rect" gradientshapeok="t" extrusionok="f"></v:path><lock v:ext="edit" aspectratio="t"></lock></v:shapetype><v:shape><v:imagedata src="11560image001.gif" title="crc01"></v:imagedata></v:shape><B></B></P>
> C++引借了C的这种颇为简单的、与机器结构极为近似的存储方案,同时也引借了C在表达式、控制结构以及函数等方面所使用的方案。例如,我们可以像下面这样写一个函数,其功能是在vector里查找一个元素并返回一个指向匹配元素的指针:</P>
>int* find(int v[], int vsize, int val) //在v中查找val</P>) Z1 [$ Q+ [' r$ \) I7 p3 G
>{</P>
>for(int i = 0; i < vsize; i++) //从0到vsize-1的循环</P>6 k7 r" S% r6 z( _5 m' V3 y
> if (v == val) return &v; //如果找到val,就返回指向元素的指针</P>" c# s# ?( t( V/ @
>return &v[vsize]; //如果没找到,就返回v末端元素的指针</P>. c" F; \2 Y1 K! \. ]# ^
>}</P>
>++运算符意即“增量”。因此“C++”这个名称可以理解为“多于C”、“换代的C”或者“C之加强版”。“C++”的发音是“See Plus Plus”(译注:拟音作“斯伊 普拉斯 普拉斯”)。</P>
>find()函数可以像这样使用:</P>5 A" Q/ o) c9 K/ {5 z' f8 h
>int count[] = {2, 3, 1, 9, 7, 3, 3, 0, 2};</P>









| 欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) | Powered by Discuz! X2.5 |