Chinaunix首页 | 论坛 | 博客
  • 博客访问: 44555
  • 博文数量: 12
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 70
  • 用 户 组: 普通用户
  • 注册时间: 2012-10-11 11:42
文章分类
文章存档

2012年(12)

我的朋友
最近访客

分类:

2012-10-11 11:45:52

void fun(char str[100])
{
       printf("%d\n",sizeof(str));
}
int main()
{
     char *p2 = (char *)malloc(100);
     fun(p2);
}

数组作为函数参数是按照地址传递的,也就是说此时数组名相当一个指针,指针字节数是机器地址总线的位数,
那么在32位机子中指针为4个字节,而与其所指对象类型无关。故char str[100] 和 char *str是一样的。输出4.


在声明一个函数的数组参数时,可以不指定大小。数组做为函数参数,使用的是“传址”方式。由于传递的是数组的地址,而不是数组的所有元素,所以函数可以不知道该数组的实际大小。

声明一个函数时:

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,以保留数组相关信息。
二维数组可以使用指向数组的指针代替,而指针数组才可以用指向指针的指针代替。数组退化为对应的指针,元素的类型保持一致;因此二维数组不能退化为二级指针,而只能退化为指向一维数组的指针。

字符常量做下标,
静态字符串最后会被放入静态区,调用处会是指针,所以可以
从汇编上看,编译器转换都是指针加偏移,*(3+p)   和  *(p+3)是一回事,就是 3[p] 和 p[3] 。
阅读(672) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~