数组与指针学习(一)

【数组】

数组的存储与初始化

  1. 一维数组的存储:数组元素在内存中顺次存放,地址是连续的。元素间地址上的相邻,对应着逻辑次序上的相邻。
  2. 如int a[10]; a:数组名字,数组名字是数组首元素的内存地址,数组名是一个常量(地址类型/指针类型的常量),不能被赋值。
  3. 一维数组的初始化:
    ①列出全部元素的初始值,此时可以不指定数组的长度。如:int a={1,2,3,4,5}
    ②可以只给一部分元素指定初值.
    4.二维数组的存储:按行存放,可以理解为一维数组的数组。例:int a[3][4]; a[0]表示0行的首地址,a表示a[0][0]的地址,存储顺序:a00 a01 a02 a03 a10 a11 a12 a13 a20 a21 a22 a23.
    5.二维数组的初始化:
    ①将所有初值写在一个{}内,按顺序初始化。
    ②分行列出二维数组元素的初值。例:int a[3][4]={(1,2,3,4),(5,6,7,8),(9,10,11,12)}
    ③只对部分元素初始化:要进行分组给出初始值(参照②)。
    ④当列出全部初始值时,第一维的坐标可省略。
    二维数组的初始化:
    如果不作任何初始化,局部作用域的非静态数组中会存在垃圾数据,static数组中的数据默认初始化为0
    如果只对部分元素初始化,剩下的未显式初始化的元素,将会自动被初始化为0

    例题
    例1:用数组存放斐波那契数列
#include<iostream>
using namespace std;
int main()
{
   int f[20]={1,1};//初始化第0、1个数
   for(int i=2;i<20;i++)
      f[i]=f[i-2]+f[i-1];//求第2~19个数
   for(i=0;i<20;i++)//每行输出5个数
   {
        if(i%5==0) cout<<'\n';
        cout.width(12);//设置输出宽度为12
        cout<<f[i];
    }
    return 0;
 } 

例2:循环从键盘读入若干组选择题答案,计算并输出每组答案的正确率,直到输入ctrl+z为止,计算每组答案的正确率。
每组连续输入5个答案,每个答案可以是’a’…‘d’.

#include<iostream>
using namespace std;
int main()
{
  const char key[]={'a','c','b','a','d'};
  const int NUM_QUES=5;
  char c;
  int ques=0,numCorrect=0;
  cout<<"Enter the "<<NUM_QUES<<" questions tests."<<'\n';
  while(cin.get(c))//get函数一次执行读取一个字母,将其赋给c
  {
    if(c!='\n')
    {  
       if(c==key[ques])
       {
          numCorrct++;cout<<' ';
        }
        else 
          cout<<'*';
        ques++;
      }
     else
     {
         cout<<"Score "<<static_cast<float>(numCorrct)/NUM_QUES*100<<"%";
         ques=0;numCorrect=0;cout<<'\n';
      }
      return 0;
 }

运行结果:
Enter the 5 questions :
acbbc
**Score 60%

数组作为函数参数

  1. 数组元素作实参,与单个变量一样。
  2. 数组名作参数,形、实参数都应是数组名,类型要一样,传送的是数组首地址,对形参数组的改变会直接影响到实参数组。
  3. 例题:使用数组名作为函数参数:主函数中初始化一个二维数组,表示一个矩阵,并将每个元素都输出,然后调用子函数,分别计算每一行的元素之和,将和直接存放在每行的第一个元素中,返回主函数之后输出各行元素的和。
#include<iostream>
using namespace std;
void rowSum(int a[][4],int nRow)//行数不确定,有4列,所以要包含一个nRow 
{
	for(int i=0;i<nRow;i++)
	   for(int j=1;j<4;j++)
	      a[i][0]+=a[i][j];
}
int main()
{
	int table[3][4]={{1,2,3,4},{2,3,4,5},{3,4,5,6}};
	for(int i=0;i<3;i++)
	{
		for(int j=0;j<4;j++)
		  cout<<table[i][j]<<' ';
		cout<<'\n';
	}
	rowSum(table,3);//用数组名table作实参,调用子函数,(将数组table的首地址传给了rowSum,求每一行的和 
	for(int i=0;i<3;i++)
	 cout<<"Sum of row "<<i<<" is "<<table[i][0]<<'\n';
	return 0; 
 } 

对象数组

1.定义对象数组:
类名 数组名[元素个数];
访问对象数组:
通过下标访问:数组名[下标].成员名
2.对象数组初始化

  • 数组中每一元素对象被创建时,系统都会调用类构造函数初始化该对象。
  • 通过初始化列表赋值。
    例:Point a[2]={Point(1,2),Point(3,4)};
  • 如果没有为数组元素指定显式初始值,数组元素便使用默认值初始化(调用默认构造函数)。
    3.数组元素的构造和析构
  • 构造数组时,元素所属的类未声明构造函数,则采用默认构造函数。
  • 各元素对象的初值要求为相同的值时,可以声明具有默认形参值的构造函数。
  • 个元素对象的初值要求为不同的值时,需要声明带形参的构造函数。
  • 当数组中每一个对象被删除时,系统都要调用一次析构函数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值