CC++中为何不宜按值传递数组而非指针?
- 内容介绍
- 相关推荐
本文共计910个文字,预计阅读时间需要4分钟。
错误的代码:`ID_INLINE mat3_t : :mat3_t(float src[3][3]) { memcpy(mat, src, sizeof(src)); }`
说明:有时程序员会忘记在C/C++中数组不能按值传递。当你尝试这样操作时,实际上传递的是数组的指针(第一个元素),而不是整个数组。因此,当你在函数中操作这个指针时,只会影响传递进来的数组的第一个元素,而不是整个数组。
错误的代码:
ID_INLINE mat3_t::mat3_t( float src[ 3 ][ 3 ] ) { memcpy( mat, src, sizeof( src ) ); }
说明:
有时候程序员会忘记 C/C++ 里数组不能按值传递给函数。当你试图这样做时,是数组的指针(第一个元素的地址)而不是整个数组被传递。我们还应该记住,方括号中的数字没有任何意义。它们仅仅是程序员所做的标志,记录了传递数组的『假定』大小。事实上,你也可以传递一个大小完全不同的数组。例如,下面的代码就会成功编译:
void F(int p[10]) { } void G() { int p[3]; F(p); }
相应的,sizeof(src) 运算符表示的不是数组的大小,而是指针的大小。结果就是memcpy() 仅复制了数组的一部分。也就是4或8字节,这取决于指针的大小(外部结构体不算)。
本文共计910个文字,预计阅读时间需要4分钟。
错误的代码:`ID_INLINE mat3_t : :mat3_t(float src[3][3]) { memcpy(mat, src, sizeof(src)); }`
说明:有时程序员会忘记在C/C++中数组不能按值传递。当你尝试这样操作时,实际上传递的是数组的指针(第一个元素),而不是整个数组。因此,当你在函数中操作这个指针时,只会影响传递进来的数组的第一个元素,而不是整个数组。
错误的代码:
ID_INLINE mat3_t::mat3_t( float src[ 3 ][ 3 ] ) { memcpy( mat, src, sizeof( src ) ); }
说明:
有时候程序员会忘记 C/C++ 里数组不能按值传递给函数。当你试图这样做时,是数组的指针(第一个元素的地址)而不是整个数组被传递。我们还应该记住,方括号中的数字没有任何意义。它们仅仅是程序员所做的标志,记录了传递数组的『假定』大小。事实上,你也可以传递一个大小完全不同的数组。例如,下面的代码就会成功编译:
void F(int p[10]) { } void G() { int p[3]; F(p); }
相应的,sizeof(src) 运算符表示的不是数组的大小,而是指针的大小。结果就是memcpy() 仅复制了数组的一部分。也就是4或8字节,这取决于指针的大小(外部结构体不算)。

