2012年(12)
分类:
2012-10-11 11:45:52
原文地址:C和指针的探索~(更新中) 作者:流云哭翠
在声明一个函数的数组参数时,可以不指定大小。数组做为函数参数,使用的是“传址”方式。由于传递的是数组的地址,而不是数组的所有元素,所以函数可以不知道该数组的实际大小。
在 声明一个函数时:
void Func(int arr[]);
及在定义它时:
void Func(int arr[])
{
...
}
上面中的参数:int arr[]。没有指定数组arr的大小。这样做的好处是该函数原来只能处理大小固定是5的数组,现在则可以处理任意大小的整型数组。 当然,对于一个不知大小的数组,我们处理起来会胆战心惊,因为一不小心就会越界。一般的做法是再加一个参数,用于在运行时指定该数组的实际大小:
void Func(int arr[], int size)
{
for(int i=0;i
arr[i] = i;
}
栈上分配的数组和堆上分配的数组在内存排列上可能不相同。
栈上: int ia[2][2] = {2,3,4,5}; //4个元素是连续排列的内存段
堆上: int **p = new int*[2]; //只有每行内是连续排列,各行并不一定连续排列
int **是在内存里面实际上是树形的,int **指向一组int *,int *再去指向一组int。而int a[2][2]在内存分布实际上是一维线性的。
二维数组做参数并不进行两次退化。退化为 char (*str)[MAXLEN]而非 char ** str,以保留数组相关信息。 |