关键点
- 1、使用循环对数组进行下标引用时,计算机每次都需要进行:取下标值、将它与数组元素类型大小相乘、获取地址值。而使用指针时,指针
++
,编译器只需计算一次,然后记录下来,下次会自动进行偏移(由于数组是由相同元素组成的)。所以使用下标,其效率可能比指针低,单一定不会比指针高。但下标可读性好,导致可维护性高,所以变成时需要权衡效率和可读性! - 2、数组名只是一个指针常量,指向数组首地址(第一个元素地址)。所以不能对数组名进行会产生"副作用"的四则运算。
- 3、所有函数传参都是通过传值方式传递的,哪怕传的是数组名和指针,都是传其值的一份拷贝!
- 4、数组名为数组首地址,即第一个元素的地址,所以数组名值加1的操作为元素地址指针加1,从而指向下一个元素;而取数组名的地址得到的是整个数组,数组名地址加1的操作为地址偏移整个数组大小;
int ar[10]; ar == &ar[0], ar+1 == &ar[1];
&ar
得到整个数组,&ar+1
往后偏移整个数组长度。 - 5、对于指针数组,应该以 NULL 指针 为最后一个元素结束。
0个元素数组
1、理论支持:
数组收包含0个或多个相同元素的集合,注意:是0个或多个,也就是说数组元素个数可以是0个;对于0个元素的数组,其含义是:编译器不分配内存空间,但会分配一个地址给他,这个地址就是数组名;
2、巧妙利用这个特性:
拥有一个地址,那么,在结构体成员当中,在需要使用数据空间时,可以使用 malloc 函数多分配数据需要的空间给结构体,这样就可以直接使用数组名来访问该空间数据,可以把它理解为不占内存空间的指针;只不过,它不是一个指针,不能直接接 malloc 函数分配的数据空间地址。这样就达到了节省一个指针空间的作用,多用于链表数据节点结构体。