(三)函数和数组
1.数组作为函数的形参时,真实发生的情况。
当我们用数组形式作为函数的形参时,比如aadd(int a[],int x);a代表的并不是数组,而是一个指针,是指向int类型的指针,一般将数组名传递给它,也就是第一个元素的地址。它与int *a,int x这种参数列表的形式是等价的。当我使用这个函数的时候,只需要给它一个指向第一个元素的地址即可。!!!!!在c++中,当且仅当用于函数头或函数原型时,int *a和int a[]才是等价的。另外,记住两个恒等式:a[i]=*(a+i); &a[i]=a+i;
将指针加一,也就是前面学习的指针算术,实际上就是加上一个指针指向的数据类型对应的长度之后的地址,对于数组来说(由于数组在内存是连续存放的,也就是说是数据结构中的顺序线性表),就是下一个元素的存放位置。
2.sizeof运算符
sizeof运算符后面加一个变量或类型名的时候,可以加括号,也可以不加,得到的将是多少字节数,如果是数组名,将会得到整个数组的大小,如果是指针,得到的是存储指针的空间的大小。还要注意的是sizeof并不是一个函数,而是一个算子,也就是运算符,就像return 0;等一样,可以不加括号(但是后面跟类型的时候要加括号)。
3.显示数组及用const保护数组
(1)常量指针
为了防止无意中损坏了数组的内容,当用数组作为实参的时候,我们可以将形参定义成常量指针,从而确保数组的内容是只读的,以达到保护数组的作用。如:void show_array(const double ar[],int n)。
!!!!!其实const的意思就是指针或引用都不可以修改储存位置的数据(除了初始化的时候之外),变量的名称也可以看成是一种引用。
(2)另一种给函数提供所需要的信息的方法
即指定元素的区间,也就是给函数传递两个指针,一个指向开头,一个指向结尾元素后面的一个位置。比如数组a[20],则a指向第一个元素,a+19指向最后一个元素,a+20指向最后一个元素后面。
(3)!!!!!指针和const
当我用const来标识一个指针的时候,比如const int *a=&at;则at不一定是一个常量,但是这个指针是一个常量指针,因此对这个指针来说,它指向的值是一个常量,我们不能通过指针来更改它。但是at实际上并不是一个常量,我们完全可以通过它的名称at来访问和修改。这也是常量指针的一个保护数据的方式。c++一般禁止将const常量的地址赋值给非const指针变量。因此,如果条件允许(也就是不用来修改原始数据),应该将函数的指针参数声明为const指针,这样就可以同时处理非const数据和const数据。
(4)常量指针和指针常量:
常量指针指的是通过指针无法修改它所指向的值,其定义是这样的const int *a,表示a是指向整型常量的指针(至少对a来讲数据是常量),但a指针本身可以被改变。而指针常量是指指针本身是一个不可以更改的常量,但它所指向的值是一个可以更改的值。定义是这样的: int *const a=&at;表示a指针是不能指向别的位置的,只能指向at的位置。