c++ 学习笔记之复合数据类型

 

数组

数组是一连串在内存中连续存储的相同数据类型的元素集合,并且每个元素都可以通过唯一的索引来访问。

这里写图片描述

以上是一个含有 5个 int 类型数据的数组。

可以这样来声明它, int foo [5];

注意: 中括号里是数组的长度,必须是常量,因为数组是一系列静态内存块,其大小在编译时就确定了。

数组初始化

tips:

  • 对于一般的定义在函数内部的数组,在声明时,不会自动初始化。
  • 对于定义在函数外部或者在 namespace 内部的数组,在声明时,会自动初始化(对于基本数据类型,默认值是 0)。

几种初始化方式介绍:

方式一:

int foo [5] = { 16, 2, 77, 40, 12071 }; 

这里写图片描述

方式二:

int bar [5] = { 10, 20, 30 };

这里写图片描述

方式三:

int foo [] = { 16, 2, 77, 40, 12071 };
//编译器自动根据 {} 中的元素个数推断数组大小

数组同样适用统一初始化方式:

//两者相等
int foo[] = { 10, 20, 30 };
int foo[] { 10, 20, 30 };

多维数组

声明一个二维数组:

int jimmy [3][5];

这里写图片描述

访问其中一个元素:

jimmy[1][3]

这里写图片描述

数组的维数越多,占据的内存空间也会指数型地增加。

示例:

char century [100][365][24][60][60];
//century 数组有超过 3 billion 个 char 元素,会占据超过 
//3 gigabytes (30 亿字节)的内存

利用二维数组和简单数组解决同一个问题:

//二维数组方式
#define WIDTH 5
#define HEIGHT 3

int jimmy [HEIGHT][WIDTH];
int n,m;

int main ()
{
  for (n=0; n<HEIGHT; n++)
    for (m=0; m<WIDTH; m++)
    {
      jimmy[n][m]=(n+1)*(m+1);
    }
}
//简单数组方式
#define WIDTH 5
#define HEIGHT 3

int jimmy [HEIGHT * WIDTH];
int n,m;

int main ()
{
  for (n=0; n<HEIGHT; n++)
    for (m=0; m<WIDTH; m++)
    {
      jimmy[n*WIDTH+m]=(n+1)*(m+1);
    }
}

两种方式初始化后的数组 jimmy 内存状态如下:
这里写图片描述

数组作为参数

在 c++ 中,数组作为函数参数,传递的是其引用地址,并非拷贝,因为
由于历史原因,数组不能被直接拷贝。

示例:

// arrays as parameters
#include <iostream>
using namespace std;

void printarray (int arg[], int length) {
  for (int n=0; n<length; ++n)
    cout << arg[n] << ' ';
  cout << '\n';
}

int main ()
{
  int firstarray[] = {5, 10, 15};
  int secondarray[] = {2, 4, 6, 8, 10};
  printarray (firstarray,3);
  printarray (secondarray,5);
}

多维数组也可以作为函数参数:

void procedure (int myarray[][3][4])
//上述数组参数,3 和 4 分别表示了另外两个维度的大小,这对编译器是
//必要的。

数组类型容器

c++ 的 array 库提供了数组定义的模板容器,容器数组除了具有普通
数组的操作以外,还可以被拷贝。

以下用普通数组和容器数组实现相同的例子:

//普通数组
#include <iostream>
using namespace std;

int main()
{
  int myarray[3] = {10,20,30};

  for (int i=0; i<3; ++i)
    ++myarray[i];

  for (int elem : myarray)
    cout << elem << '\n';
}
//容器数组
#include <iostream>
#include <array>
using namespace std;

int main()
{
  array<int,3> myarray {10,20,30};

  for (int i=0; i<myarray.size(); ++i)
    ++myarray[i];

  for (int elem : myarray)
    cout << elem << '\n';
}

字符序列

指针

动态内存

数据结构体

其他数据类型

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值