首页 > 编程语言 >C++自学笔记15(数组)

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

时间:2024-07-25 09:55:17浏览次数:11  
标签:main 15 int C++ 数组 自学 赋值 example 指针

指针是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;时才会被销毁。

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

标签:main,15,int,C++,数组,自学,赋值,example,指针
From: https://blog.csdn.net/weixin_64418869/article/details/140665786

相关文章

  • C++自学笔记16(字符串与字符串字面量)
    当我们想在电脑上以文本方式表示东西时,一个单词、一个句子、一大段文章都叫做字符串。字符串就是为了我们去处理文字文本的方法。字符串实际上就是字符组成的数组或指针(数组就是指针的一种)。(有人会问数组不是储存数字么?怎么储存字符?因为ASCLL码表将所有字母、数字、符号翻译......
  • C++11——lambda表达式
    一、前言在C++98中,如果想要对一个数据集合中的元素进行排序,可以使用std::sort方法。intmain(){ intarray[]={4,1,8,5,3,7,0,9,2,6}; //默认按照小于比较,排出来结果是升序 sort(array,array+sizeof(array)/sizeof(array[0])); //如果需要降序,需要改变元素......
  • C++学习笔记(03)——通讯录管理系统设计
    记录一下利用C++来实现一个通讯录管理系统系统中需要实现的功能如下:添加联系人:向通讯录中添加新人,信息包括(姓名、性别、年龄、联系电话、家庭住址)最多记录1000人显示联系人:显示通讯录中所有联系人信息删除联系人:按照姓名进行删除指定联系人查找联系人:按照姓名查看指定联系人......
  • 卡皮巴拉(c++)
    题目描述有一种卡皮巴拉玩偶,它有头、身体、四肢三个部分,每个部分需要使用不同的材料制作。玩具公司生产了很多批次的卡皮巴拉玩偶,每个批次的玩偶的三个部分都分别有多种款式(每种款式只需使用一种材料)。现在有`k`批次的卡皮巴拉玩偶,每个批次的玩偶的头、身体和四肢的款式分别......
  • 成员函数(c++)
    题目描述针对上一题的情形,除了在结构体外新设计一个函数 get_grade 外,我们可以用另外一种方法,给类添加一个成员函数,如下所示。structStudent{intx;inty;intz;intget_grade(){//todo}};此后,对于每一个 Student 类的对象 s,我们可以......
  • 图的最短路径算法(SPFA,Dijkstra,Bellman_Ford)(迪杰斯特拉算法,Spfa算法,贝尔曼-福特算
    目录Dijkstra迪杰斯特拉算法写法时间复杂度例题描述输入描述输出描述样例输入用例输出用例写法Spfa算法例题描述输入描述输出描述样例输入用例输出用例写法Bellman_Ford算法(贝尔曼-福特算法)写法例题描述输入描述输出描述样例输入样例输出样例......
  • 【知识扩展】C/C++编译原理
    C/C++编译原理一、前言二、编译原理1、预处理2、编译3、汇编4、链接三、头文件和库文件1、头文件2、库文件四、编译器1、GCC编译器1.1、编译过程1.1.1、预处理1.1.2、编译1.1.3、汇编1.1.4、链接1.2、创建静态库1.2.1、静态库源码编译成.o的文件1.2.2、编译静态库1.......
  • 【 Pro*C/C++ 】 Pro*C/C++ 编程
    ProC/C++编程1一、ProC/C++简介11.1、ProC/C++是什么11.2、ProC/C++处理流程2二、ProC/C++GCC环境配置32.1、ProC/C++预编译环境32.2、GCC编译器5三、开始编写第一个ProC++代码53.1、第一个ProC++代码53.2、ProC++代码预编译63.3、GCC编译73......
  • 前端学习4——自学习梳理
    续弹性盒子模型介绍弹性盒子的一些属性(基本属性以及布局(重要:定位))<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0">&l......
  • C++语法10:C++实现0-1背包问题的动态规划解法
    动态规划(DynamicProgramming):解锁复杂问题的钥匙在算法设计与分析的广阔领域中,动态规划(DynamicProgramming,DP)无疑是一把锋利的剑,用于斩断复杂问题中缠绕的荆棘。它通过将大问题分解为小问题,并存储子问题的解来避免重复计算,从而高效地解决了一系列看似无解的难题。本文将从......