数组在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]