数组

一维数组的定义和引用

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

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

例如:定义一个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[ ];//没有确定数组大小

字符型数组的初始化

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

#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\n",number[0]);
    printf("%d\n",sizeof(int));
    printf("%d\n",sizeof(number)/4);
    printf("string\n");
    printf("%d\n",sizeof(string)/sizeof(char));
    printf("%d\n",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;
}

 

posted on 2019-09-21 00:46  iBoundary  阅读(431)  评论(0编辑  收藏  举报

导航