全部博文(272)
分类: C/C++
2014-05-08 09:39:10
五岳之巅2014-05-13 08:47:07
CUTianrui007:数组作为函数参数时,转化为指针,是有其原因的,我们都知道,函数参数是要入栈的,如果是数据直接传送的话,那么数组如果很大的话,那么函数孤栈显然是不够用,不同的数组容量其所占用栈空间也不同,这就充满不确定性。
所以,C语言简单起见,统一将数组当成指针来用。
这个反映到C++中,那就是引用,当使用一个对象作为函数参数时,要调用拷贝构造函数,所以引入引用,那就不用再拷贝了。
没错,就是这样。C语言也是人设计出来的,可行性也非常关键。谢谢补充。
回复 | 举报CUTianrui0072014-05-12 21:35:52
数组作为函数参数时,转化为指针,是有其原因的,我们都知道,函数参数是要入栈的,如果是数据直接传送的话,那么数组如果很大的话,那么函数孤栈显然是不够用,不同的数组容量其所占用栈空间也不同,这就充满不确定性。
所以,C语言简单起见,统一将数组当成指针来用。
这个反映到C++中,那就是引用,当使用一个对象作为函数参数时,要调用拷贝构造函数,所以引入引用,那就不用再拷贝了。
五岳之巅2014-05-12 13:10:47
dididimeme01:其实,这个就是(*s)++和*s++,按你的例子研究了一下,*s++是列移动,(*s)++行移动.不过深入研究了思考了一下,觉得更多的我们用的是char s[3][20]这样的静态数组比较多,如果需要指针的话,还需要连接上才能使用,而且对指针的超界问题需要更多思考,一不留神就会出现越界问题。值得一说的是,你的foo函数有边界溢出问题,即第二次*s++的时候越界了,因此你定义的是一个2个指针。
感谢你认真的态度,赞。工具都有两面性,电脑可以帮人工作,也可以误人子弟。指针也是一样,溢出往往会形成隐含的Bug,但其更加灵活。但不论那种方式,能解决问题就好。
回复 | 举报dididimeme012014-05-12 09:55:43
其实,这个就是(*s)++和*s++,按你的例子研究了一下,*s++是列移动,(*s)++行移动.不过深入研究了思考了一下,觉得更多的我们用的是char s[3][20]这样的静态数组比较多,如果需要指针的话,还需要连接上才能使用,而且对指针的超界问题需要更多思考,一不留神就会出现越界问题。值得一说的是,你的foo函数有边界溢出问题,即第二次*s++的时候越界了,因此你定义的是一个2个指针。