- 顺序存储一般的结构如数组,标准的初始化时需要的是"基址,当前表长,最大表长"
- 数组的首地址(基址)就是数组名
- 数组是最常用的数据结构之一,在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))