函数传递数组 例子

函数传递数组的问题

  1. void fun(char b[10])
  2. {
  3. int i = sizeof(b);
  4. char c = b[3];
  5. }


如果数组b 真正传递到函数内部,那i 的值应该为10。但是我们测试后发现i 的值竟然
为4!为什么会这样呢?难道数组b 真的没有传递到函数内部?是的,确实没有传递过去,
这是因为这样一条规则:
C 语言中,当一维数组作为函数参数的时候,编译器总是把它解析成一个指向其首元
素首地址的指针。

~~~能否把指针变量本身传递给一个函数?

  1. void fun(char *p)
  2. {
  3. char c = p[3];//或者是char c = *(p+3);
  4. }
  5. int main()
  6. {
  7. char *p2 = “abcdefg”;
  8. fun(p2);
  9. return 0;
  10. }

这个函数调用,真的把p2 本身传递到了fun 函数内部吗?我们知道p2 是main 函数内的一个局部变量,它只在main 函数内部有效。

(这里需要澄清一个问题:main 函数内的变量不是全局变量,而是局部变量,只不过它的生命周期和全局变量一样长而已。全局变量一定是定义在函数外部的。初学者往往弄错这点。)

既然它是局部变量,fun 函数肯定无法使用p2 的真身。那函数调用怎么办?好办:对实参做一份拷贝并传递给被调用的函数。即对p2 做一份拷贝,假设其拷贝名为_p2。那传递到函数内部的就是_p2 而并非p2 本身。(那么我们怎么传递呢,1.用地址 2.用返回值,上个帖子说过这个问题)

~~~二维数组参数与二维指针参数


前面详细分析了二维数组与二维指针,那它们作为参数时与不作为参数时又有什么区别呢?看例子:
void fun(char a[3][4]);

C 语言中,当一维数组作为函数参数的时候,编译器总是把它解析成一个指向其首元素首地址的指针。这条规则并不是递归的,也就是说只有一维数组才是如此,当数组超过一维时,将第一维改写为指向数组首元素首地址的指针之后,后面的维再也不可改写。比如:a[3][4][5]作为参数时可以被改写为(*p)[4][5]。

传参时的等效

数组参数 等效的指针参数

数组 : char a[10] 指针 : char * p;
数组的数组:char a[3][4] 数组的指针:char (*p)[4]
指针数组: char *a[5] 指针的指针:char **p

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值