数组拾遗

      写这篇文章的主要目的就是为了记录下来平常我们用数组的时候不是很注意的问题!!!

  • 下标越界
    #include <iostream>
    using namespace std;
    int main()
    {
    	int b[10];
    	b[10]=3;
    	cout<<"b[10]="<<b[10]<<endl;
    }
    

      上面这个程序会输出b[10]=3;但是只要我们细心就可以发现,b[10]其实只包括了从b[0]~b[9]。那么这里的b[10]不就是越界了嘛!!!这个错误会让紧接着b这个数组之后的内存被强行赋值为3!这当然是应该避免的了。但是由于标准的C++代码不限制下标越界,虽然这样做可以使代码的运行速度加快,效率提高,但是这会很容易地修改其他变量的值,而且不容易发现。解决办法只有一个:我们应该经常留意数组的下标值是否在合理的范围之内。
p.s. 由于本人用的是vs2008,貌似它会在运行的时候报错,如下图:

  •  输出数组名
          假如我们声明的数组为a,那么编译器就会自动生成一个指向该数组的指针,而且该指针保存的是数组第一个元素的内存地址。相当于程序中添加这样一行代码:int *a=&a[0];程序如和输出如下图:
  • 如何将数组传递给一个函数
          在写程序的时候,我们不可避免的会用到数组和函数,而且更常见的是在函数中队数组进行一个操作。比如说求平均值啊之类的。而在C++中,规定了是不能将整个数组传递给一个函数的,因为数组一般都非常大,如果我们在函数中还要赋值一个数组的副本,那内存开销就会很大,这也就太对不起内存了。那怎么办呢?其实,我们只需要传递给函数数组第一个元素的地址,即数组名,然后就可以在这个函数中由这个数组名找到该数组,然后就可以对该数组进行操作了。传递数组名一共有三种方式:
    //方法1:简要数组声明
    void func(int a[])
    {
    	//函数体
    }
    
    //方法2:标准数组声明
    void func(int a[10])
    {
    	//函数体
    }
    
    //方法3:指针声明
    void func(int *a)
    {
    	//函数体
    }
    
          由于上面这3种方法都告诉了编译器将要受到一个指向整型变量的指针(原因:参见第二个黑点 ^_^),因此这三种方法都木有问题!下面,我们用一个程序来说明如何将数组传递到一个函数中:
    /************************************************************************/
    /* 求100~199之和的平均值                                                                                      */
    /***********************************************************************/
    #include<iostream>
    float Average(const float *,int); //函数原型
    int main()
    {	
    	float a[100],average,num=100; 
    	//num是第1个数的值,average是平均值
    	int i,total=100;			//total是参加运算的元素总数
    	for (i=0;i<100;++i)//给数组a赋值
    	{
    		a[i]=num;				//将num的值赋给数组的第i个元素
    		num++;					//由于100-199是依次加1,因此num++
    	}							
    	//调用函数x,传递的第1个参数a便是数组名a
    	average= Average(a,total);		//调用函数,执行传参,然后在函数结束后返回一个平均值
    	std::cout<<"100-199的平均值为"<<average<<std::endl;
    	return 0;
    }					
    
    float Average(const float *a,int total)	
    //向函数Average()中传递数组名,也就是数组a第1个元素的内存地址
    //函数定义里声明了一个指针接收方式,接收到一个数组名,也就是第1个元素的内存地址,
    //并使用自定义的指针a访问数组a的内存,进行赋值操作
    {
    	int i;
    	float sum=0.0,b;		
    	for (i=0;i<total;++i)	
    	{
    		sum=sum+a[i]; 		
    	}
    	b=sum/total; 			
    	return b; 				
    }
    
          该程序的输出为:
  • 删除堆中的数组
          如果我们利用new在堆中声明了一个数组,比如说下面这句话声明了一个有1000个area对象组成的数组,而通过调用关键字new操作符来把整个数组创建在堆中:
    area *one=new area[1000];
    
          而删除数组one的时候我们需要调用下面这句话:
    delete []one;
    
    这句话表示删除数组中的每个对象。所以说,在堆中删除一个数组十分简单,我们只需要输入delete[],然后再后面加上数组名就可以了。但是,应该注意的一点是:千万不要写成delete one;或者是delete one[]。因为[]表示我们删除的是一个数组,如果你忘记输入[],那么删除的只是one[0]。这样就会带来内存泄露哈!!特别注意!!!



posted @ 2011-07-21 17:01  uniqueliu  阅读(2263)  评论(0编辑  收藏  举报