C++中的数组问题

和C语言一样,C++中也存在数组,而且用法也与C语言中的一样。

  • 数组的定义:和C语言中的一样,定义一个数组需要指定其大小和类型,但注意,数组的定义不能出现未知长度或长度为变量的情况,如:
int a[5];  //定义一个长度为5的整形类的数组,即该数组中可存放5个整形数
int a[];  //产生编译错误,数组a的长度未知
int i;
int a[i]; //产生逻辑错误,因为i是未知数
//但是如下定义是合法的,但会产生警告:
int j;
cin >>j;  //从键盘中输入j的值
int b[j]; //此处会出现警告“unused variable 'b'[-Wunused-variable]”
  • 数组的赋值:数组即可以一一赋值,也可以同时赋值,还可以通过for或while循环来赋值,例如:
int a[] = {1, 2, 3, 4, 5} //定义的同时赋值,这时a的大小可以不写,编译器会根据后面数据的个数来默认a的长度,此处为5
int b[4];  //一一赋值
b[0] = 1;  //注意,数组的第一个数据一定是从0开始到长度-1
b[1] = 2;
b[2] = 3;
b[3] = 4;
int c[100];
for(int i = 0; i < 100; i++)
    c[i] = i;   //采用for循环赋值,这里的i不再是变量,因为在for循环中,每次循环i都有一个具体的值
  • 数组的输出问题:若要输出数组中的全部内容,可以采用一一输出,也可用for或while循环输出,例如:
int b[2] = {1, 2};
cout << b[0];
cout << b[1];   //一一输出
int c[100];
for(int i = 0; i < 100; i++)
    c[i] = i; 
for(int i = 0; i < 100; i++)
    cout << c[i] << "\t";  //采用for循环输出
  • 赋值与输出,如果一个数组的长度为5,但赋值的只有2个,若全部输出,则剩下的3个数输出任意数字,例如:
int a[5];
a[0] = 5;
for(int i = 0; i < 5; i++)
    cout << a[i] << endl;

输出结果:

但若采用同时赋值的方法,则其他的默认为0:

int a[5] = {5};
for(int i = 0; i < 5; i++)
    cout << a[i] << endl;

输出结果:

  • 数组所占空间:如果数组只是定义,并没有初始化(赋值),那么该数组所占的空间只是首地址的空间,但如果初始化了(赋值了),则该数组所占空间为长度×数组类型所占空间,不论是否全部赋值:例如:
int a[5];
cout << sizeof(a);  //输出4,因为首元素为int型4字节
a[0] = 5;
cout << sizeof(a);  //输出20,因为此时已经初始化了,虽然只给了1个数据,但其大小已经是5×4
char b[5];
cout << sizeof(b);  //输出1
b[0] = 'a'; 
cout << sizeof(b);  //输出5
  • 二维数组和多维数组:二维数组相当于是一个矩阵,分为行和列,其定义与赋值同一维数组,例如:
int a[2][3];   //定义一个两行三列的“矩阵”
a[0][0] = 1;
a[0][1] = 2;
a[0][2] = 3;   //先给第一行赋值
//……再给第二行赋值
int b[2][3] = {1, 2, 3, 4, 5, 6}; //直接同时赋值
//int b[][] = {1, 2, 3, 4, 5, 6};   非法,会产生编译错误,因为编译系统不知道有多少行或多少列
//int c[2][] = {1, 2, 3, 4, 5, 6};  非法,因为已经给定了行,但列未给出
//int d[][3] = {1, 2, 3, 4, 5, 6};  非法,因为已经给定了列,但行未给出
//int e[][] = {{1, 2, 3}, {4, 5, 6}}; 非法
//还可以采用for或while循环赋值,只是这时需要使用两次:
int f[2][3];
for(int i = 0; i < 2; i++){   //控制行循环
    for(int j = 0; j < 3; j++){ //控制列循环
        f[i][j] = i + j;  //赋值
    }
}

同样地,输出也可以采用同样地方法。下面就可以利用二维数组来输出一些矩阵了,例如:请写一个程序要求设置一个矩阵,要求交换其行和列地位置,代码如下:

#include <iostream>
using namespace std;
int main(){
    int array[4][4];
    for(int i = 0; i < 4; i++)  //采用for循环给4×4矩阵赋值
        for(int j = 0; j < 4; j++)
            array[i][j] = i * j + j;
    for(int i = 0; i < 4; i++){
        for(int j = 0; j < 4; j++)
            cout << array[i][j] << "\t"; //输出,每个数之间加一个tab
        cout << endl;   //每行之间换一行,看起来比较舒服
    }
    int flag;   //设置一个中间变量用以交换
    for(int i = 0; i < 4; i++){
        for(int j = 0; j < i; j++){  //控制循环,列小于行即可,避免再次交换回来
            flag = array[i][j];
            array[i][j] = array[j][i];
            array[j][i] = flag;   //交换
        }
    }
    cout << "----------交换后----------" <<endl;  //再次输出
        for(int i = 0; i < 4; i++){
        for(int j = 0; j < 4; j++)
            cout << array[i][j] << "\t";
        cout << endl;
    }
    return 0;
}

输出结果:

如有错误,欢迎大家批评与指正!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值