函数传递数组的问题
- void fun(char b[10])
- {
- int i = sizeof(b);
- char c = b[3];
- }
如果数组b 真正传递到函数内部,那i 的值应该为10。但是我们测试后发现i 的值竟然
为4!为什么会这样呢?难道数组b 真的没有传递到函数内部?是的,确实没有传递过去,
这是因为这样一条规则:
C 语言中,当一维数组作为函数参数的时候,编译器总是把它解析成一个指向其首元
素首地址的指针。
~~~能否把指针变量本身传递给一个函数?
- void fun(char *p)
- {
- char c = p[3];//或者是char c = *(p+3);
- }
- int main()
- {
- char *p2 = “abcdefg”;
- fun(p2);
- return 0;
- }
这个函数调用,真的把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