数组

作者: 潘雪雯 | 来源:发表于2020-05-19 11:27 被阅读0次
    • 概念
    1. 元素类型角度:数组是相同类型的变量的有序集合
    2. 内存角度:联系的一大片内存空间


      image.png
    • 数组初始化
    int a[10] = {1,2}; //其他初始化为0  指定长度
    int b[] = {1, 2}; //不指定长度
    

    注意点

    1. 数组名代表数组首元素的地址,是一个常量。(变量的本质是内存空间的别名,一定以数组,就分配好内存,所以数组名起名后不能修改)
    2. 数组首元素的地址和数组的地址值相等


      image.png
    • 数组类型
      数组的类型由元素类型和数组大小共同决定
    • 数组指针类型
    1. 通过数组类型定义数组指针
    typedef int(ArrayType)[5];  //声明一个数组类型
    ArrayType* pointer; //数组类型加* 定义一个数组指针变量
    
    
    1. 声明一个数组指针类型
    typedef int (*MyPointer)[5]; //声明一个数组指针类型
    MyPointer mypoint ;//用数组指针类型定义一个变量
    
    1. 直接定义:
      int:指向数组的类型
      pointer:数组指针变量名
      n:指向数组的大小
    int (*pointer)[n]; //直接声明一个数组指针变量
    
    1. 一维数组做函数参数,并改变其值
      面试题21:调整数组顺序使奇数位于偶数前面
    2. 一维数组的那么坑
    int a[5]={1,2,3,4,5};
    (&a+1): 2293300
    (&a):2293280
    a:2293280
    a+1:2293284
    

    小结:a和&a都是数组首地址,a+1是数组第二位的地址,(&a+1)是以数组的长度为单位往后移动
    实战

    #include<iostream>
    #include<string.h>
    using namespace std;
    
    int main()
    {
        int a[5]={1,2,3,4,5};
        //int *ptr_1 = (int *)(&a);
        //printf("%d\n",*ptr_1);
        int *ptr=(int *)(&a+1);
        printf("%d\n",*ptr);
        //printf("%d,%d,%d,%d\n",(&a+1),(&a),a,a+1); //刚好差20个字符 
        printf("%d,%d",*(a+1),*(ptr-1));  2 5
        return 0;
    }
    
    • 多维数组
    char a[i][j] = *(*(a+i)+j)
    int b[10]://  
    

    int b[10]
    b代表数组首元素的地址
    &b代表数组的地址
    &b+1指针后移4*10个单位
    char cbuf[30]; //&cbuf(二级指针) 代表整个数组的地址
    char array[10][30]
    (array+i)相当于整个第i行的数组地址 即&cbuf
    (*(array+i))一维数组的首地址 cbuf
    (*(array+i))+j 相当于第i行第j列的地址 &array[i][j]
    *((*(array+i))+j)相当于第i行第j列的地址的值 array[i][j]

    image.png
    image.png

    相关文章

      网友评论

          本文标题:数组

          本文链接:https://www.haomeiwen.com/subject/sdbvohtx.html