1. 顺序存储 --- 数组

  1. 顺序存储一般的结构如数组,标准的初始化时需要的是"基址,当前表长,最大表长"
  2. 数组的首地址(基址)就是数组名
  3. 数组是最常用的数据结构之一,在C/C++中经常对数组进行操作,作为一个顺序存储结构,其很容易实现随机查找第 i 个数据元素,但是相对的插入或删除时会移动大量的数据;故数组适用于相对稳定的线性表。

一般标准的操作包括:

  • 初始化
  • 释放数组空间(动态分配的空间,用完释放好习惯)
  • 数组置为空表
  • 是否为空
  • 返回当前数组长度
  • 返回第一个等于数值 e 的位置信息
  • 数值 e 的前驱,后继
  • 插入操作
  • 删除操作
  • 遍历
//数组的插入和删除操作代码实现,后补,其他的操作比较简单


下面总结一下常见的数组易混淆的概念 (重要)

1 . 数组名和数组名取地址的区别

int a[2] = {1, 2};

int main()
{
    printf("a = %p\n", a);
    printf("&a = %p\n", &a);
    printf("a + 1 = %p\n", a+1);
    printf("&a + 1 = %p\n", &a + 1);

    return 0;
}

/*
a = 0x804a014
&a = 0x804a014
a + 1 = 0x804a018
&a + 1 = 0x804a01c
*/

《C和指针》 详细介绍了数组名 a 与 数组名取址 &a 的区别:

在C中,在几乎所有的使用数组的表达式中,数组名是一个常量指针(即该指针是一个常量),也就是数组第一个元素的地址。它的类型取决于数组元素类型:比如为 int 类型,那么数组名的类型就是 "指向 int 的常量指针"( int * const)类型
但是:在以下两种场合中,数组名并不是用常量指针来表示

即当数组名作为sizeof操作符单目操作符 & 的操作数时

  • sizeof(数组名) : 返回整个数组的预分配内存的大小,而不是类型大小
  • &(数组名) : 产生的是一个指向数组的指针,而不是执行某个常指针的指针

上例中, a 和 &a 结果都是数组的首地址,但是类型完全不同

  • a 表示 &a[0] (等价),是数组首元素的地址,常指针( int * const)类型
  • &a 表示指向整个数组的指针,类型为 ( int * [数组元素个数] )

[注]
数组名仅仅"相当于"指针,并非严格意义上的指针,作为常量,不能作为左值,不能自加自减 (++,--);并且常量是无法取地址的,能够 &a ,是因为 a 的意义已不是数组名了。
a 与 &a[0]两者等价,均表示常指针,( int * const)类型,不能作为左值,自加自减。


两个数组赋值,int a[] 赋值给 int b[] ,不能通过首地址赋值的方式( b = a),因为数组名是常指针,不能作为左值,采用以下两种方式

  • for循环,一个一个元素的赋值
  • 用memcpy(dst, src , sizeof(dst))

你可能感兴趣的:(1. 顺序存储 --- 数组)