搜索
查看: 1613|回复: 8
打印 上一主题 下一主题

求解:C语言中函数将数组作为参数相互传递的问题

[复制链接]
跳转到指定楼层
楼主
发表于 2013-8-27 18:46:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
5啊哈币
先放出一段代码,新手可能有写的不好或者不对的地方

# include <stdio.h>                               //   1


void fun(int a[])                                //        2
{                                                       //        3
     int t;                                      //              4
     for(t=0; t<5; t++)                          //       5
          printf("%d ", a[t]);                   //        6
}                                               //                7

int main()                                     //            8
{                                              //                9
    int a[5]= {1,2,3,4,5};                   //        10
    fun(a);                                //                11
    return 0;                            //                 12
}                                        //                      13
重点是第十一行代码,C语言是不是要求形参跟实参的类型必须一致么?但是在第二行中明明fun需要的参数是一个数组
但是第十一行传递的却是a数组的入口地址这样一来形参跟实参的类型不就不一致了么?问别人,有人说C语言中数组无法直接进行相互传递,只能借助指针将入口地址传递过去就行了,但是我想说的是fun(*a)跟fun(a[5])(或者fun(a[]))难道一样么?

最佳答案

查看完整内容

你可以理解成“C语言中根本没有数组这种东西”,有的只是连续分配空间的一种语法糖。 数组在绝大多数情况下都会转换成一个指针,例如a[1]其实不是读取数组元素,编译器总是把它处理成 *(a + sizeof(int) * 1),所以你甚至可以写 1[a] 函数传递参数时,如果参数是数组,则会转换成指向数组首地址的指针 也就是你写编译器会自动转化为如果你写也会被转化为数组的长度是无法用一个参数就传递进去的,因为数组这时候被转换成了指 ...
沙发
发表于 2013-8-27 18:46:53 | 只看该作者
你可以理解成“C语言中根本没有数组这种东西”,有的只是连续分配空间的一种语法糖。
数组在绝大多数情况下都会转换成一个指针,例如
  1. int a[] = {1,2,3};
  2. a[1];
复制代码
a[1]其实不是读取数组元素,编译器总是把它处理成 *(a + sizeof(int) * 1),所以你甚至可以写 1[a]

函数传递参数时,如果参数是数组,则会转换成指向数组首地址的指针
也就是你写
  1. void fun(int a[]);
复制代码
编译器会自动转化为
  1. void fun(int* a);
复制代码
如果你写
  1. void fun(int a[10]);
复制代码
也会被转化为
  1. void fun(int* a);
复制代码
数组的长度是无法用一个参数就传递进去的,因为数组这时候被转换成了指针
板凳
发表于 2013-8-27 21:34:37 | 只看该作者
数组做函数参数,一般函数用两个参数,第一个用来描述数据个数,第二个是数组.
地板
发表于 2013-8-28 14:57:17 | 只看该作者
学习了     
5#
 楼主| 发表于 2013-8-28 16:43:11 来自手机 | 只看该作者
这么说来,在C中数组其实也是以指针的形式存放的是吧?
6#
 楼主| 发表于 2013-8-28 16:43:41 来自手机 | 只看该作者
rosynirvana 发表于 2013-8-27 18:58
你可以理解成“C语言中根本没有数组这种东西”,有的只是连续分配空间的一种语法糖。
数组在绝大多数情况下 ...

这么说来,在C中数组其实也是以指针的形式存放的是吧?
7#
发表于 2013-8-28 17:06:16 | 只看该作者
406965097 发表于 2013-8-28 16:43
这么说来,在C中数组其实也是以指针的形式存放的是吧?

不是
大多数时候你用数组变量的时候,编译器自动转换成指针
8#
发表于 2013-8-28 18:42:41 | 只看该作者
{:soso__3945808576210393699_2:}
9#
发表于 2013-10-8 10:36:51 | 只看该作者
你可以理解成“C语言中根本没有数组这种东西”,有的只是连续分配空间的一种语法糖。
数组在绝大多数情况下都会转换成一个指针,例如
int a[] = {1,2,3};
a[1];
复制代码
a[1]其实不是读取数组元素,编译器总是把它处理成 *(a + sizeof(int) * 1),所以你甚至可以写 1[a]

函数传递参数时,如果参数是数组,则会转换成指向数组首地址的指针
也就是你写
void fun(int a[]);
复制代码
编译器会自动转化为
void fun(int* a);
复制代码
如果你写
void fun(int a[10]);
复制代码
也会被转化为
void fun(int* a);
复制代码
数组的长度是无法用一个参数就传递进去的,因为数组这时候被转换成了指针
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

广播台
特别关注
快速回复 返回顶部 返回列表