黑马程序员技术交流社区

标题: 关于数组传参数的问题 [打印本页]

作者: Freedam    时间: 2014-5-20 13:32
标题: 关于数组传参数的问题
本帖最后由 Freedam 于 2014-5-22 20:24 编辑

在学习视频中的代码时遇到了一个数组传参数的问题。
  1. //void change(int array[10])
  2. //void change(int *array)
  3. //void change(int array[])
  4. //void change(int *array[10])
  5. void change(int array[10])
  6. {
  7.       array[0] = 100;
  8. }

  9. int main()
  10. {
  11.     int ages[5] = {1,2,3,4,5};
  12.     change(ages);
  13.     printf("%d\n",ages[0]);
  14.     return 0;
  15. }
复制代码

change函数我写了这几种方法都能改变第一个元素的值,int array[10]和int *array[10]不一样啊,为啥在传参数的时候再运行就得到一样的结果了呢,请大家看看,帮忙解惑。
作者: 戒惜舍得    时间: 2014-5-20 14:53
本帖最后由 戒惜舍得 于 2014-5-21 05:46 编辑

当你的行参 是  int array[10]的时候  
注意 下面这句话  
  编译时,是将 array 按指针变量处理的,相当于将   
void change(int array[10))   写成
void change(int *array[10])
  以上两种 写法是等价的
   在 该函数被调用时, 系统会建立一个指针变量  array, 用来存放从主调函数传递过来的实参数组首元素的地址。
  在李明杰 老师的 视频里 也讲了
   假如 你用 数组 作为形参的话
    用 sizeof   测定数组作占的字节数  为 8(  在苹果 的64位编译器下)。这就证明了 系统是把
  数组作为指针变量来处理的。
  当  array 接受了实参数组的首元素地址后,array 就指向实参数组的首元素,也就是指向 ages[0]。
因此,  *array就是 array[0]。
array[0] 和 *array 以及 *array[0] 都代表数组 ages 序号为 0  的元素。
作者: Freedam    时间: 2014-5-22 20:00
理解了 也就是系统内部已经把数组做了一些处理了 对吧




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2