zoukankan      html  css  js  c++  java
  • 数组

    一维数组的定义和引用

    定义:一维数组是指数组中的每个元素只带有关下标的数组。

    格式:类型说明符 数组名 [ 常量表达式 ]

    例如:定义一个5个元素的整型数组

    int array[5];

    1.int 表示定义的定义的数组是整型数组,即数组空间里面存放整形变量
    2.array 是定义数组的名称

    3.[5] 是表示定义的数组有5个元素,每个类型都是整型(需要注意的是数组的下标都从0开始,所以5个元素分别是array[0]、array[1]、array[2]、array[3]、array[4])(所以,array[5]是不属于该数组的空间范围的)

    4.总结出来就是 int array[5] 它是定义一个有5个元素的数组,所以它是合法存在的。而 array[5] 它是指数组当中下标为5的一个元素,在本举例中,它不存在、不合法(因为下标为5,即是数组的第6个元素)

    数组定义中的下标必须是不可变的

    错误示例:

    int size_overall=50;
    int main()
    {
        int size_local=50;
        int array[size_overall]; //错误!!!
        int brray[size_local];   //错误!!!
    }

     正确操作:

    #include<stdio.h>
    const int i = 5;  #不允许变量改变关键字const:用常数来描述数组定义中的元素个数
    #define NUM 5     #宏定义不可变变量NUM:用符号常量来描述数组定义中的元素个数
    int main()
    {
        int number[NUM];
        number[0] = 0;
        printf("%d",number[0]);
        return 0;
    }

    数组初始化

    示例1:

    int array[6]={1,2,3,4,5,6};
    int brray[6]={1};
    int crray[6]={1,2,3};

    上面定义和初始化的数组空间大小为6,意思是可以存储6个数据,下表0~5.

    示例2:

    int array[5]={2,4,6,8,10};
    int brray[ ]={2,4,6,8,10};

    上面两个数组,除了数组名不一样,作用都相同。即发现,在定义数组并且同时对数组进行了完全初始化的情况下,我们可以省略数组大小

    在没有规定数组大小的情况下,如果给定的初始值很多,我们怎么知道数组的大小呢?用sizeof来解决:

    int a[] = {1,2,4,6,8};
    int len = sizeof(a)/sizeof(int);

    初始化的几种错误示例

    int array[5] = {1,2,3,4,5,6};//错误!!!初始化值个数多于数组元素个数
    int brray[5] = {1, ,2,3,4};//错误!!!初始化的时候不能跳跃省略,编译器不会给你自动初始化为0
    int crray[5] = {1,2,3, };//错误!!!同样跳跃省略
    int drray[5] = {1,2,3};//正确,意味着drray[0]=1,drray[1]=2,drray[2]=3,drray[3]=0,drray[4]=0
    int erray[5] = { };//错误!!!语法格式错误
    int frray[ ];//没有确定数组大小

    字符型数组的初始化

    对于字符串的初始化,要注意数组实际分配空间大小事字符串中字符个数加上末尾的’’结束符

    #include<stdio.h>
    #include<iostream>
    const int i = 5;
    #define NUM 5
    int main()
    {
        int number[NUM];
        char string[] = "I love you!";
        number[0] = 0;
        printf("%d
    ",number[0]);
        printf("%d
    ",sizeof(int));
        printf("%d
    ",sizeof(number)/4);
        printf("string
    ");
        printf("%d
    ",sizeof(string)/sizeof(char));
        printf("%d
    ",strlen("I love you!"));
        return 0;
    }

     数组做参数的函数声明
    在调用和定义函数之前,我们需要先声明函数,声明函数的时候可以简写(即不写参数的函数名,只是单单定义类型)。下面我们声明一个求和函数,其函数名为sum,它的第一个参数是数组(代表调用的是这个数组,而不是那个数组),第二个参数是长度(整型)

    # include <iostream>
    
    int sum(int [],int);//最简单的正确写法
    
    int main()
    {
        //………………
    }

    当然也可以换成另外一种可视化程度较高的样子

    # include <iostream>
    
    int sum(int array[],int len);//让人知道了你声明的函数想要干什么,但其功能与上面的简单写法无异
    
    int main()
    {
        //………………
    }

    数组做参数的函数定义

    # include <iostream>
    
    int sum(int [],int);//求和函数声明
    
    int main()//主函数,下一部分会把它补全
    {
        //………………
    }
    
    int sum(int array[],int len)//这里必须补全,即相当于定义了局部变量
    {
        int tempSum=0;
        for(int i=0;i<len;++i)//一般都使用for函数遍历数组
            tempSum+=array[i];
        return tempSum;
    }

    数组做参数的函数调用

    根据需要定义有无返回值的函数,就上题求和的例子接着,我们定义了一个有返回值的函数,并且准备调用它,一般有返回值的函数,我们都会利用它的返回值,所以对它进行一个赋值操作:

    # include <iostream>
    
    int sum(int [],int);//函数声明
    
    int main()
    {
        int array[5]={2,3,6,8,10};//初始化
        int sumArray;//为之后的函数返回值赋值做准备
        sumArray=sum(array,5);//函数的返回值赋值给sumArray;
        //最重要的是调用函数的时候,如果传参是一个数组,就只要传它的数组名就可以(因为传递数组实际上传递的是数组的首地址),千万不要写成array[] !!!
        cout<<sumArray<<endl;
    }
    
    int sum(int brray[],int length)//注意:这里定义的参数只是起局部变量的意思,你想给它叫什么名字就什么名字,不必和主函数中数组的名字相同
    {
        int tempSum=0;
        for(int i=0;i<length;++i)//注意,如果上面参数局部变量是什么名字,就用什么名字
            tempSum+=brray[i];//注意,如果上面参数局部变量是什么名字,就用什么名字
        return tempSum

    求数组中储存了东西的长度对于已知类型、已初始化的数组长度

    方法1:

    #include <iostream>
    using namespace std;
    int main()
    {
        int array[]={1,4,2,7,13,45,793,32};
        int size;
        size=sizeof(array)/sizeof(int);
        cout<<size<<endl;
        return 0;
    }

    方法2:

    #include <iostream>
    using namespace std;
    int main()
    {
        int array[]={1,4,2,7,13,45,793,32};
        int size;
        size=sizeof(array)/sizeof(*array);
        cout<<size<<endl;
        return 0;
    }

    对于需要输入赋值的字符型数组长度

    #include <iostream>
    #include <cstring>
    using namespace std;
    int main()
    {
        char array[100];
        int size;
        cin>>array;//只有字符型数组可以这样写输入的代码
        size=strlen(array);
        cout<<size<<endl;
        return 0;
    }

    给数组分配内存空间的问题

    从上面代码中我们发现能分配的空间数都是定死的,以下介绍两种在程序运行时申请某个大小的内存空间。
    malloc()free()来获得和释放堆内存
    需要引入头文件 # include <stdlib.h> 来调用这两个函数

    #include <iostream>
    #include <stdlib.h>
    using namespace std;
    int main()
    {
        int size;//元素个数
        int *array;//一个拥有内存的指针可以作为一个数组使用
        cout<<"请输入数组长度:";
        cin>>size;
        
       array = (int *)malloc( size*sizeof(int));//分配堆内存
    
        for(int i=0;i<size;++i)
            cin>>array[i];
    
        for(int i=0;i<size;++i)
            cout<<array[i]<<" ";
        cout<<endl;
        free( array );//释放堆内存
        return 0;
    }

    用new[]和delete[]来获得和释放堆内存

    这两个函数是c++专用的操作符,不需要引入头文件

    #include <iostream>
    #include <stdlib.h>//因为之后用到了exit(1);
    using namespace std;
    int main()
    {
        int size;//元素个数
        int *array;//一个拥有内存的指针可以作为一个数组使用
        cout<<"请输入数组长度:";
        cin>>size;
        
       array = new int[size];//分配堆内存
    
        for(int i=0;i<size;++i)
            cin>>array[i];
    
        for(int i=0;i<size;++i)
            cout<<array[i]<<" ";
        cout<<endl;
        delete[]array ;//释放堆内存
        return 0;
    }
  • 相关阅读:
    oracle各个版本的exp/imp兼容性
    AJAX开发 下载和安装ATF的步骤
    页面省略显示——web
    Oracle数据库中分区表的操作方法
    Hashtable的使用(2)
    RMAN之实战RMAN备份
    oracle_索引使用简介
    oracle中rollback的使用方法
    Hashtable的使用
    startup 出现的监听错误或者未初始化服务句柄【数据库归档问题】
  • 原文地址:https://www.cnblogs.com/iBoundary/p/11561087.html
Copyright © 2011-2022 走看看