数组的基本定义不在赘述
主要说一下容易错的地方
访问数组元素:
数组每个元素都分配一个下标,下标用作一个索引来精确定位一个数组中的特定元素,第一个元素分配下标 0,第二个元素分配下标 1,依此类推。
int hours [6];
C++中的下标编号总是从零开始,数组中最后一个元素的下标比数组中元素的总数少 1,即hours[6]不存在
hours 数组中的每个元素在被下标访问时都可以用作 int 变量
hours[0] =20;
如果采用全局定义方式定义一个包含数值的数组,则默认情况下,其所有元素都被初始化为零。但是,如果定义的是局部数组,则没有默认的初始值。
数组名和指针:可以将数组名赋值给一个指针,而赋值后的指针是指向数组首元素的,这让数组名看起来确像一个指针。
数组名可以像指针一样运算,对数组的索引和指针的运算看起来也是相同的。
数组名不等价于指针,大多数使用到数组名的地方,编译器都会把数组名隐式转换成一个指向数组首元素的指针来处理。只有两种情况下例外:
int a[]={0,1,2,3,4,5,6,7,8,9};
1.对数组名使用sizeof运算符
sizeof(a)
这将会得到整个数组所占的内存大小,a是长度为10的int(4字节)数组,运算结果是40。此时a代表的是数组所占用的那一整块内存。
2.对数组名取地址
&a
运算结果是数组的地址。注意,数组的地址和数组首元素的地址是不同的概念,尽管二者存储的值是相同的,但它们的跨度是不同的
&a表示数组地址,结果是指向该数组的指针; pa+1的值是pa所指空间的下一个空间的地址,偏移大小为整个数组的大小;
&a[0]表示数组首元素地址,其结果是指向该数组首元素的指针 pi+1指向a[1];
int a[]={1,2,3}; int (* pa)[3]; int * pi; pa = &a; pi = &a[0];
除了上面说的两种例外,其他情况下编译器都将数组名隐式转换成指针常量
a[3] // 自动转换成下面的表达式 *(a + 3)
a的值被转换成指针常量,指向第一个元素,向右移动3 * sizeof(int)个字节,然后解引用,便得到了第4个元素的内容
第一种写法会自动转换成第二种,这个过程需要一些开销,第二种写法通常效率更高
1).int p[3]:定义了一个名为p的数组,数组有三个整形元素,p指向第一个元素,是一个常量,不可以更改再赋值
2).int (*p)[3]:定义了一个名为p的指针变量,该指针指向一个三元素数组,p是一个指针变量,可以重新赋值(int (*p)[3] p是指向类型为int,长度为3数组的指针,即数组指针。)
int a[3]={1,2,3}; (*p)[3]; p=&a;
3).int *p[3]:定义了一个名为p的数组,该数组有三个元素,每个元素都是一个指针,指针指向整形变量; (定义了一个三维数组,其中的每个元素p[0]、p[1]、p[2]都是指向int变量的指针)指针数组
一张图帮助理解:
原文:https://www.cnblogs.com/liu6666/p/12459643.html