数组是什么

数组在c的表现是一些连续地址的指针

int a[3]

这个a 是数组类型,但a也是个指针,是a[0]的指针,根据“一些连续地址的指针"规则

a[1] 自然是 a+1:指针地址的值+1

这就是数组,至于多维数组,他的指针仍然是连续的,只是可以[0][1]这样取而体现了不同。

那么这个a到底是什么呢 还是把他理解为指针变量 最清晰,这样在动态申请数组内存的时候对于变量就更好理解

数组a[0]的指针就是数组a的指针就是数组a。

malloc(sizeof(int*)*4)   申请4个int大的的内存(连续的)

(int*)malloc(sizeof(int*)*4) 转换为int指针 a[0]是* 指向int

int **a = (int**)malloc(sizeof(int*)*4) a[0]是*,指向*,*指向int

 

那么理解 “连续地址的指针”  再去理解链表与数组到底哪个快就更好理解了

如果顺序读取(按顺序读) 其实是没有区别的

链表是通过指针找到下一个指针,数组是能过指针0+n指到下一个

但不按顺序读取时,

链表一个一个读的逻辑,再与数组的指针+n计算指针地址逻辑比,明显数组的读取就快了。

同样,由于逻辑不同,链表也有删除的优点。

看起来 "按地址计算其他位置" 与 “指针指向下个位置” 是完全不同的逻辑,而且是完全无法相融合的逻辑。

甚至于细想想,这好像完全不是能一起比较的两种方案。一个硬件派,一个逻辑派。

 

指针数组与数组指针

int *p1[10]; 包含指针的数组

int (*p2)[10];  指向数组的指针

 

“[]”的优先级比“*”要高。

p1 先与“[]”结合,构成一个数组的定义,数组名为p1,int *修饰的是数组的内容,即数组的每个元素。

那现在我们清楚,这是一个数组,其包含10 个指向int 类型数据的指针,即指针数组。

至于p2 就更好理解了,在这里“()”的优先级比“[]”高,“*”号和p2 构成一个指针的定义,指针变量名为p2,int 修饰的是数组的内容,即数组的每个元素。数组在这里并没有名字,是个匿名数组。那现在我们清楚p2 是一个指针,它指向一个包含10 个int 类型数据的数组,即数组指针。

 

一个小技巧

(*p)[10] 

*p+1 == (*p)[1]

 

 

posted @ 2013-09-24 20:00  晨祷  阅读(656)  评论(0编辑  收藏  举报