一维和二维数组

一维

  • 什么是数组
    就是一组数
    官方:一组相同类型的元素的集合
    ​int a = 1;
    int b = 2;
    太繁琐
    创建一个空间一次能放一组数
  • 一维数组的创建与初始化


    arr name数组名
    数组元素类型
    对应语法写一个数组
    arr[8];放八个元素
    八个什么类型的;int
    每个元素的类型 char
    []里的一定是一个常量表达式
    int n = 8;
    int arr [ n];
    n是个变量不允许
    这个非常常见的一种错误
    devc++的可以跑过去
    c99语法支持变长数组-数组的大小是变量
    vs2019不支持
    gcc对c99支持的比较好
    不知道支不支持就别用常量
  • 初始化


    int arr[10] = {1,2,3,4,5,5,6,7,78,};//完全初始化
    int arr [10] = {1,2,3,4,5}//不完全初始化会是1234500000
    int arr[] = ={1,2,3.4}它会根据后面的初始化内容来确定元素个数
    字符数组
    char ch[5] = {'b''i''t'};
    还可以这样写
    char arr3[5] = "bit";//b i t \0 0
    char arr4[] = "bit"; //bit \0
    最后一张图:区别两种写法的区别
    第一个数组四个元素bit\0
    第二个数组三个元素bit
    通过打印可以看出区别
    我们知道我要为内存里ch5分配空间
    找了一个空间放了一个bit\0
    你不知道前面后面拿到什么空间
    但是你是从c开始,从左向右,遇到\0停止
    第二个的时候打印出来,t后面是什么不知道,一直打印直到遇到\0
    ​如果我们在这求长度strlen(ch5);bit就是3
    但是strlen(ch6),没有遇到\0,一直往后找,是个随机值
    请大家注意这个点
    还要引头文件
    devc++算的是3
  • 一维数组的使用
    • 下标引用操作符


      int arr[10 ] = {0};这个表达式认为初始化第一个为0,后面也默认为0
      int arr[10] = {0};
      如果我们想给这个数组第五个元素放5就先去咋办;
      潜规则:你创建了一个空间,那内存就给你分配了这个空间0也行
      而且她的下标是0从9(数组下标从0开始)
      arr[4] = 5;//这里[]是下标引用操作符
      printf("%d,arr[4]);
      我们把十个元素都打印出来
      int i =0;
      int sz = sizeof(arr) / sizeof(arr[0]);总数组大小40除以第一个元素的大小4就是这个数组的元素个数
      for循环printf("%d",arr[i]);
    • 一维数组在内存中的储存


      我们怎么研究
      我们把每个元素的地址打印出来
      然后打印每个地址
      %p是专门打印地址的-十六进制的打印
      %x也是十六进制打印
      但是地址是有长度的不能说12就是12,地址是二进制序列的吗
      八个十六制数是因为
      一个十六制进位要转换出来四个二进制位
      所以8个十六制进位是把32个二进制位转换出来
      32个二进制位是四个字节空间大小就是一个地址大小,所以就补了六个0
      ​我们发现这样的结果
      ​A8变成AC
      十六进制中0-9 abcdef 1011121314
      c是12 12和8差4
      12加上4是16,逢16进一,A变成B
      都差4,是因为每个整形元素的字节大小都是4
      那这两个地址之间就差4,因为一个字节给一个地址
      之间差了四个字节,即四个地址编号
      我们可以判决两个东西
      1.一维数组在内存中是连续存放的
      2.随着数组下标的增长,地址是由低到高变化的!
      有个这个基础,我们对于数组的访问更加容易
      我们可以通过301找到303
      我们知道第一个空间的地址就可以以后所有的空间地址
      我们感受一下
      数组名是数组首元素的地址
      就是因为数组在内存中是连续存放的

       

二维

  • 二维数组的创建和初始化


    int arr[3] [4];
    二维是有行和列
    初始化的意思---创建的同时可以给赋值
    int arr [3][4] = {1,2,3,4,54,6,7,76,7,6786};
    不完成初始化--后面补0还可以
    int arr [3] [4]= {{1,2},{2,3},{2,4}};
    把某个值放在某一行就这样写
    把它定义为三个一维数组
    int arr [] [4]= {{1,2},{2,3},{2,4}};
    行可以省略,列不能省略,你会发现依然有三行
    因为里面包含了三个{},你有几行,会根据你初始化的情况来决定
  • 二维数组的使用通过下标的方式


    我们把它打印出来,就是下标法
    语法规定:我们第一行是0,第一列也是0
    我们确定一个元素,arr[1][2]

    假设我们把所有元素打印出来
    两个for循环arr[i][j];
  • 二维数组在数组中的储存


    我们不打印元素内容,打印每个元素的地址
    %p打印打字
    printf("&arr[%d][%d] = %p",i,j.&arr[i][j]);

    结论:

    二维数组在内存中也是连续存放的!不是行列图,看第二张图
    一行内部连续,跨行也是连续!!才有每个差4
    有什么用
    int arr[] [4];
    为什么4不可以省略
    4是决定以一行有几个元素,只有确定一行有几个元素,才可以第二行放哪里去
    行可以省略
    因为只要列确定了,你就可以随便放,放完就行
    我们如果拿到这个位置的地址,所有元素的地址就可以打印
    int *p = &arr [0][0];把第一行第一个元素的地址拿出来
    两个for循环
    printf("%d",*p);
    p++;
    只有你知道内存的布局情况才能打印出来

    增加对代码的理解
    二维数组中明确知道,
    我们访问他们arr[0][0]
    我们可以看作一维数组
    二维数组第一行数组名arr[0]

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值