C++自学笔记15(数组)

指针是C++中数组的工作方式,没有指针基础可以看笔记6

数组就是一堆变量的集合,有没有感觉与结构体很相似?

让我们来考虑下在结构体中我们仅仅是定义了几个变量例如定义x,y坐标与speed速度。如果我们需要64个变量表示某个东西的64种状态,那么你会看到

int a0 = 0;

int a1 = 1;

int a2 = 2;

int a3 = 3;

int a4 = 4;

int a5 = 5;

int a6 = 6;

int a7 = 7;

如此还要到63,可想而知这是没有意义的,所以我们引入数组。

int main()
{
    int example[5];
    example[0] = 2;
    example[4] = 2;
    std::cout<<example[0]<<std::endl;
    std::cin.get();

}

我们创建一个example数组【5】代表了需要存放5个数,当我们对这五个数赋值时example[0] = 2;
    【0】表示第一个数据,example[4] = 2;【4】表示第五个数据。对于数组的索引都是从0开始的因为,对于二进制000->0,001 ->1,010->2,011->3,100->4。我们不可能为了计数而去空闲掉000而从001开始。

数组赋值

那我们对example中五个数都赋值2

int main()
{
    int example[5];
    example[0] = 2;
    example[1] = 2;
    example[2] = 2;
    example[3] = 2;
    example[4] = 2;
    std::cout<<example[0]<<std::endl;
    std::cin.get();

}

还会出现与之相同的问题,对64个数值赋值怎么办?

我们采用for循环

int main()
{
    int example[5];
    for(int i = 0;i < 5;i++)
        example[i] = 2;
    std::cout<<example[0]<<std::endl;
    std::cin.get();

}

对于循环将i<5替换成i<=4可不可以呢?可以的,但是<相比于<=计算机的开销更小,省去了判断相等这步,而且执行效果一样没必要使用<=。

还有一件事,对于这个长度为5的数组如果对example[5]或者example[-1]赋值,这就超出了划定为范围,这是极其危险的,因为你不知道超出的位置你改写了什么。

使用memory1对数组的内存视图来看,我们赋值的5个四字节的2,在内存上是连续存放的。

所以当example[1]变到example[2]时,索引加一,内存向后偏移1*sizeof(int)四个字节。

数组与指针

int main()
{
    int example[5];
    int* ptr = example;

    std::cout<<example[0]<<std::endl;
    std::cin.get();

}

example实际上在这里就是整型指针,还记得我们说指针就是送货员拿着指针看地址对吧,指针指向一个房子。数组就像是送货员拿着指针看联排别墅,你拿到的指针对应着5栋别墅的第一栋别墅(第0个地址),你将指针加一就指向了第二个别墅(第1个地址)。

所以送货员手里的指针是没有变的,那就意味着我们可以用指针修改数组,就如上述栗子。

我们再对数组内部赋值。

int main()
{
    int example[5];
    int* ptr = example;

    example[2] = 5;
    *(ptr+2) == 5;

    std::cout<<example[0]<<std::endl;
    std::cin.get();

}

我们让ptr指向example实际上指向了,example[0]的地址也就是首地址。

ptr+2代表了第三个整数的地址,*(ptr+2)表示第三个整数的数据。

在栈和堆上创建数组区别

(堆和栈是什么?挖坑~~)

int main()
{
    int example[5];
    int* Example = new int[5];

    std::cout<<example[0]<<std::endl;
    std::cin.get();

}

example数组创建在栈上,Example数组创建在堆上。两者实现的效果是一样的我们都可以用for循环将内部五个数都赋值为2,两者的区别是堆上创建的Example只有主动将其删除时才会销毁,就是说堆上的生存时间更长。int example[5];只要跳出函数的花括号就会被销毁, int* Example = new int[5];只有delete [] Example;时才会被销毁。

这就是在栈与堆上创建的数组区别之处。

  • 9
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值