C语言中数组变量及用法

在C语言中,数组是一类复杂数据类型,数组元素可以是任意数据类型,但所有元素类型必须一致。C语言中的数组值得注意的地方有以下两点:

  • C语言中只有一维数组,而且数组的大小必须在编译期就作为一个常数确定下来。然而,C语言中数组的元素可以是任何类型的对象,当然也可以是另外一个数组。这样“仿真”出一个多维数组就不是一件难事。
  • 对于一个数组,我们只能够做两件事情:确定该数组的大小,以及获得指向该数组下标为0的元素的指针。其他有关数组的操作,哪怕它们乍看上去是以数组下标进行运算的,实际上都是通过指针进行的。换句话说,任何一个数组下标运算都等同于一个对应的指针运算,因此我们完全可以依据指针行为定义数组下标的行为。

要理解C语言数组的运作机制,我们首先来声明并定义一个数组。例如

int a[3] = {3, 7, 9};

除了a被用作运算符sizeof的参数这一情形,在其他所有情形中数组名a都代表指向数组a中下标为0的元素的指针。正如我们合乎情理的期待,sizeof a的结果是整个数组a的大小,而不是指向数组a的元素的指针的大小。

从上面的理论我们不难看出,*a即数组中下标为0的元素的引用。例如,我们可以这样写:

*a = 84;

这个语句将数组a中下标为0的值设置为84。同样道理,*(a+1)是数组a中下标为1的元素的引用,依次类推。概而言之,*(a+i)即数组a中下标为i的元素的引用;这种写法是如此常用,因此它被简记为a[i]。

实际上,由于a+i与i+a含义一样,因此a[i]与i[a]也具有同样的含义。

给定一个数组,求任意(N-1)个元素的乘积中的最大值?

题目——子数组的最大乘积?
给定一个长度为N的整数数组(数组元素可以为正或负或0),计算任意(N-1)个元素的乘积中的最大值。

#include 
#define N 8
int recur_multi(int a[], int len);
int main(int argc, char *argv[])
{
    int a[N] = {5, -2, -3, -5, 3, 2, 1, 4};
    int b[N] = {0};
    int i;
    int tmp;
    int max;
    for (i = 0; i < N; ++i)
    {
        tmp = a[i];
        a[i] = 1;
        b[i] = recur_multi(a, N-1);
        a[i] = tmp;
    }
    for (i = 0; i < N; ++i)
    {
        printf("%d\t", b[i]);
    }
    max = b[0];
    for (i = 1; i < N; ++i)
    {
        if (b[i] > max)
        {
            max = b[i];
        }
    }
    printf ("\n%d\n",max);
    return 0;
}
int recur_multi(int a[], int len)
{
    if (0 == len)
    {
        return a[0];
    } else {
        return a[len] * recur_multi(a, len-1);
    }
}

[转]复仇的书呆子!2002年5月

原文:http://flyingapplet.spaces.live.com/blog/cns!F682AFBD82F7E261!375.entry

“我们争取的是C++程序员。我们已经成功地把很多人从转向Lisp的半路上给拉过来了。”

- Guy Steele,Java规范作者之一

软件行业里一直有两股力量在争斗:酷想法的学院派和同样可怕的酷头发的老板。每个人都知道酷头发的老板指哪些人,对吧?我想大多数做技术的不仅认识这个卡通人物,而且知道自己公司里面哪些人可以和这个卡通人物对号入座。

那些酷头发的老板们的身上神奇地结合了两种品质,这两种品质各自都很常见,但很少同时出现在同一个人身上:(1)对技术完全彻底一窍不通;(2)对技术有很强的主见。

比方说,你要写一个软件,酷头发的老板完全不懂软件,对编程语言也一无所知,但是他就是知道你应该有什么编程语言来开发。真的,他觉得你应该用Java开发。

他为什么这样想呢?让我们研究一下酷头发的老板的大脑的思维方式,他是这样想的:Java是标准,肯定是标准,因为天天都可以在媒体上看到。既然是标准,用它就不会给自己带来麻烦。同时市面上总是有很多Java程序员,所以如果我手下的程序员辞职了(不知道什么在捣鬼,我手下的程序员老有人辞职),我很容易找到人替代他们。

嗯,听起来不是完全没有道理。但是,这种思路基于一个隐含的假定,而且这个假定不成立。酷头发的老板们相信所有的编程语言都是基本等价的。如果真是这样他就对了,如果所有编程语言都是等价的,当然用大家都在用的语言。

但是所有的语言都不是等价的,其实不用分析语言之间的具体差异就可以证明这一点。如果1992年你问酷头发的老板应该有什么语言开发软件,他会同样毫不犹豫地告诉你答案。应该用C++开发软件。如果语言都是等价的,酷头发的老板的观点为什么会改变呢。更进一步讲,开发Java的人们还有什么必要创造一门新语言呢。

通常情况下,如果你创造一门新的语言,那肯定是因为它可以在某些方面优于已有的方法。实际上,Gosling在第一版Java白皮书中明确指出设计Java是为了解决C++语言的一些问题。所以现在你知道了:不是所有语言都是等价的。如果你顺着酷头发的老板的思路看到Java,然后沿着Java的历史看到其来源,你就会发现自相矛盾之处了。

那么谁对谁错呢?是James Gosling,还是酷头发的老板?不用说当然Gosling是对的。对于某些问题,有的语言确实比其它语言好。下面我们来看一些有意思的问题。Java被设计得在某些问题上比C++好。哪些问题呢?什么情况下Java好,什么情况下C++好?有没有某些场景下其它的语言比它们俩都好? Continue reading

用C语言写CGI程式-入门篇

原文链接:http://www.cs.tut.fi/~jkorpela/forms/cgic.html

这是一篇用C语言写CGI程式的入门文章。假定读者对C语言有基本的认识,熟悉HTML并且会在WEB服务器上安装CGI脚本。

为什么要用CGI程式?

大家都应该知道如何用HTML写表单,那么写好表单后,为了可靠地使用、处理表单数据,你仍然需要服务端脚本。通常服务端脚本以简单、类似的方式处理表单提交,典型地如向某个邮件地址发送文本数据。

但是,如果你要处理更复杂的问题,如采集数据并写入文件或数据库、或者接收信息然后转发又或者对提交的数据做四则运算,那么你不得不自己写一个的服务端脚本。

简单地说,CGI是HTML表单和服务端脚本的接口。

但CGI不是唯一的选择。建议看下Lars Marius GarsholHow the web works: HTTP and CGI explained 文章,可以使您了解CGI的概念和除CGI外的其他选择。

如果有人建议用javascript写CGI程式,让他看看这篇文章: JavaScript and HTML: possibilities and caveats. 简单说,如果不使用服务端服本备份的话,JavaScript根本不可靠。

Continue reading

浅析C++中内存分配的方式

在C++中,内存分成5个区,他们分别是堆、栈、自由存储区、全局/ 静态存储区和常量存储区。

栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区。里面的变量通常是局部变量、函数参数等。

堆,就是那些由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个 delete。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。
Continue reading

代码揭秘:C语言基本数据类型

为了有效地组织数据,规范数据的使用,提高程序的可读性,高级语言都为数据提供了一个用以限定和规范其存在的形式的属性——数据类型。

首先,我们已经知道计算机里面存储了很多二进制序列,但是不能直接面对它们,于是计算机使用一种称为“编码”的手段,使统一模式的二进制序列能够呈现出不统一的意义。 Continue reading