关于引用的疑惑
- C/C++ code
/*对于使用传递的值而不作修改的函数:如果使用数据对象是数组,则使用指针,因为这是唯一的选择,并将指针声明为指向const的指针;对于修改调用函数中的数据的函数:如果数据对象是数组,则只能使用指针*/
以上2句是书中的原文,没有解释,看不懂,为什么数据对象是数组的情况下不能使用引用只能使用指针?
[解决办法]
参考:http://www.cppblog.com/walkspeed/archive/2007/03/10/19525.aspx
象如下定义就得到一个数组的引用
类型名 (&变量明)[N];
实例
int int_array[10];
int (&int_ref)[10] = int_array;
这样就得到了一个数组的应用
在函数的声明中用数组的引用定义,就不怕数组退化了。如下
for_each( int (&int_ref)[10] )
{
for( int i=0; i<10; ++i )
std::cout << int_ref[i] << std::endl;
}
int main( int argc, char* argv[] )
{
int int_array[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }
for_each( int_array );
return 0;
}
在上面的代码中,如果你传入不是10个尺寸的数组,是编译通不过的。代码的安全性提高了。
[解决办法]
参考:http://www.cppblog.com/walkspeed/archive/2007/03/10/19525.aspx
象如下定义就得到一个数组的引用
类型名 (&变量明)[N];
实例
int int_array[10];
int (&int_ref)[10] = int_array;
这样就得到了一个数组的应用
在函数的声明中用数组的引用定义,就不怕数组退化了。如下
for_each( int (&int_ref)[10] )
{
for( int i=0; i<10; ++i )
std::cout << int_ref[i] << std::endl;
}
int main( int argc, char* argv[] )
{
int int_array[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }
for_each( int_array );
return 0;
}
在上面的代码中,如果你传入不是10个尺寸的数组,是编译通不过的。代码的安全性提高了。
[解决办法]
如果数据对象是数组则只能使用指针
事实胜于雄辩:int_array[0] 在函数中确实进行了改变,是可以传递引用的,它的值由1变为了99。
- C/C++ code
1 #include <stdio.h> 2 3 int for_each( int (&int_ref)[10] ) 4 { 5 int_ref[0] = 99; 6 for( int i=0; i<10; ++i ) 7 printf("int_ref[i] is %d.\n", int_ref[i]); return 0; 10 } 11 12 int main() 13 { 14 int i,j; 15 int & ref1 = i; 16 ref1 = 22; 17 int ref[] = {ref1, j}; 18 19 int int_array[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; 20 21 for_each( int_array ); 22 23 printf("int_array[0] is %d, ref[0] points to %p, i points to %p\n", int_array[0], &ref[0], &i); 24 printf("ref[0]=%d, %d, %d\n",ref[0], ref1, i); 25 26 27 ref[0] = 1; 28 ref[1] = 2; 29 printf("ref[0]=%d, %d, %d\n",ref[0], ref1, i); 30 printf("ref[1] = %d, j=%d\n", ref[1], j); 31 return 0; 32 }