数组

  • 概念
  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
#include
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

你可能感兴趣的:(数组)