数组的声明和定义
定义时,括号[ ]中的elements域必须是1个常量数值,因为数组是内存中一块有固定大小的静态空间,编译器必须在编译所有相关指令之前先能够确定给该数组分配多少内存空间。
数组在内存中如何存储
比如 int nArray[5] 需要20个byte的空间
假设内存的起始地址为20000,已知存放一个整数要占2个字节,那么这个数组在内存中的存放方式为
数组中的位置 | 内存地址(仅示意) | 元素值 |
---|---|---|
aArray[0] | 20000 | 0 |
aArray[1] | 20002 | 0 |
aArray[2] | 20004 | 0 |
aArray[3] | 20006 | 0 |
aArray[0] | 20008 | 0 |
整型数据在内存中每个元素的地址以2为单位递增。
实型数据在内存中每个元素的地址以4为单位递增。
数组元素的访问
初始化:只有当数组立即初始化时,才能这样声明:int nArray[]={18,20,30,45};如果只有int nArray[];这样声明是不对的,因为数组是特定的存储区间,大小必须给定。
c++中对数组使用超出范围的下标是合法的。
用数组求Fibonacci
#include <iostream>
#include<math.h>
#include<string.h>using namespace std;
int main(){
int i=0;
int f[20]={1,1};
for(i=2;i<20;i++)
{
f[i]=f[i-2]+f[i-1]; //碉堡了。。直接用数组的下标进行计算,完全蔑视了函数。。原来数组下标也可以这样用。
}
for(i=0;i<20;i++){
if(i%5==0)
{
cout<<endl;}
cout<<f[i]<<" ";
}
return 0;
}
知识普及:
斐波那契数列指的是这样一个数列:1、1、2、3、5、8、13、21、…… 这个数列从第三项开始,每一项都等于前两项之和。
它的通项公式为:(1/√5)*{[(1+√5)/2]^n - [(1-√5)/2]^n}(又叫“比内公式”,是用无理数表示有理数的一个范例。)(√5表示根号5)
有趣的是:这样一个完全是自然数的数列,通项公式居然是用无理数来表达的。
· F0 = 0
· F1 = 1
· Fn = Fn - 1 + Fn - 2
用文字来说,就是:斐波那契数列由0和1开始,之后的斐波那契数就由之前的两数相加。前边几个斐波那契数是:
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946
数组可以传递给函数
将数组作为参数传给函数
#include <iostream>
#include<math.h>
#include<string.h>using namespace std;
void disp(int nArray[],int len){
for(int i=0;i<len;i++)
nArray[i]=0;
}int main(){
int nArray[]={10,20,30,40};
int i=0;
disp(nArray,4); //把数组nArray的首地址传递给函数disp
for(i=0;i<4;i++){
cout<<nArray[i]<<",";
}
cout<<endl;
return 0;
}
二维数组
可省略第一维的大小,但必须第二维的大小。
初始化 int arr[2][3]={{1,2,3},{4,5,6}};
题:将二维数组转换为一维数组
#include <iostream>
#include<math.h>
#include<string.h>using namespace std;
int main(){
int arr1[3][2]={{1,2},{3,4},{5,6}};
int arr2[6];
for(int row=0;row<3;row++)
{
for(int cow=0;cow<2;cow++)
{
arr2[row*2+cow]=arr1[row][cow];
}
}
for(int i=0;i<6;i++)
{
cout<<arr2[i]<<"\t";
}
return 0;
}
只装“字符”的数组
在定义时对字符数组进行初始化,把每个字符赋给数组中各元素的方法。
char str[10]={'h','e','l','l','o','w','o','r','l','d'};
用1个由5个字符组成的字符串初始化1个字符数组,字符串只能在初始化时给字符数组赋值,其他地方,只能对字符数组的元素单独进行赋字符值。
char str[]=“hello”;
特殊的字符串结束符'\0’
'\0’在ASCII码中代表的是0字符,一个不可以显示的字符,是一个空操作符,即表示什么也不干,用其作为字符串结束符标志不会产生附加的操作或者增加有效字符,只是一个供辨别的标志。'\0’不是空格,空格在ASCII码中的值为32.