数组和指针
1、数组
数组标记实事上是一种变相的使用指针的形式。
Array=&array[0];//数组名是该数组的首地址
假设你是要编写一个对数组进行操作的函数。目的是要此函数返回数组内所有元素的和。。那么该如何调用:
Total=sums(muggle);//可能的调用
那么原型呢?实际参数是一个int的地址。应把它赋给一个指向int 指针的形式变量。
Int sums(int *ar);//相应的原型
函数从该参数中能得到的信息有:数组的首元素的地址。还有从地址的找到一个int 。
但是却不知道数组中元素的数量!
这种函数定义是有限制的。
Int sums(int *ar,int n);//更加适用的方法
这是第一个参数把数组地址和数组类型的信息传递给参数,第二个参数将数组中元素的个数传递给函数。此外:
在函数原型和函数定义的场合(并且也只有这两个场合中),可以用int *ar代替int ar[].。
Int sums(int ar[],int n);
无论在任何情况下,形式int *ar 都表示ar 是指向int 的指针。形式int ar[]也可以表示指向int的指针,但只是声明形式参量时才可以这样使用。
所以如果实际参数的一个数组名,那么形式参量必须是与之相匹配的指针。在(而且仅在)这种场合中,C对于int ar[] 和int *ar 作出同样的解释。即ar 是指向int 的指针。以下四种原型等价:
Int sum(int *ar,int n);
Int sum(int *,int n);
Int sum(in tar[],int n);
Int sum(int [],int n);
定义函数时,名称是不能省略的,因此,定义时以下两种形式是等价的:
Int sum(int *ar,int n){
//代码
}
Int sum(int ar[] ,int n){
//代码
}
2、指针
不能对未初始化的指针取值。例:
Int *pt;//未初始化的指针
*pt=5;//错误
把5存储在pt所指向的地址,但是由于pt没有初始化,它的值是随机的。故不知道5会存到什么位置,这个位置也许对系统危害不大,但可以会覆盖程序的数据和代码。造成程序崩溃。
因此,当创建一个指针时,系统只分配了用来存储指针本身的内存空间,并不会分配用来存放数据的内存空间。