- 存在唯一的一个被称做“第一个”的数据元素;
- 存在唯一的一个被称做“最后”一个的数据元素;
- 除第一个外,集合中的每个数据元素均只有一个前驱;
- 除最后一个之外,集合的每个数据元素均只有一个后继。
线性表的顺序表示指的是用一组地址连续的存储单元依次存储线性表的数据元素。
假设线性表的每个元素占用l个存储单元,并以所占的第一个单元的存储地址作为数据元素的存储位置。则线性表的第i+1个数据元素的存储位置和第i个数据元素的存储位置之间满足如下关系:(i+1)的位置= i 位置+l.
高级程序设计语言中数据类型具有随机存取的特性,因此通常都用数据来描述数据结构中的顺序存储结构。由于线性表长度可变,且所需最大存储空间随问题不同而不同,C语言中可用动态分配的一维数组描述。
我们看一下C语言数组的存储及元素位置之间的关系。
int main(void)
{
int a[3] = {1,2,3};
int *b = a;
return 0;
}
编译用gdb调试分析
abeen@ubuntu:~/Documents/C$ gcc test.c -g
abeen@ubuntu:~/Documents/C$ gdb ./a.out
GNU gdb (GDB) 7.0-ubuntu
Copyright (C) 2009 Free Software Foundation, Inc.
(gdb) list
1
2 int main(void)
3 {
4 int a[3] = {1,2,3};
5
6 int *b = a;
7
8 return 0;
9 }
(gdb) b 8
Breakpoint 1 at 0x80483d5: file test.c, line 8.
(gdb) r
Starting program: /home/abeen/Documents/C/a.out
Breakpoint 1, main () at test.c:8
8 return 0;
(gdb) p $esp
$1 = (void *) 0xbffff488
(gdb) info local
a = {1, 2, 3}
b = 0xbffff488
(gdb) info frame
Stack level 0, frame at 0xbffff4a0:
eip = 0x80483d5 in main (test.c:8); saved eip 0x14eb56
source language c.
Arglist at 0xbffff498, args:
Locals at 0xbffff498, Previous frame's sp is 0xbffff4a0
Saved registers:
ebp at 0xbffff498, eip at 0xbffff49c
(gdb) x/12xw 0xbffff480
0xbffff480: 0x00167345 0x005c4d20 0x00000001 0x00000002
0xbffff490: 0x00000003 0xbffff488(b) 0xbffff518(ebp) 0x0014eb56(eip)
0xbffff4a0: 0x00000001 0xbffff544 0xbffff54c 0xb7fff858
可见数组元素的存储确实用连续的存储单元。
(gdb) info local
a = {1, 2, 3}
b = 0xbffff488
(gdb) p &a
$3 = (int (*)[3]) 0xbffff488