数组及长度
来源:http://hilberttitan.blog.sohu.com/69421703.html
近日初涉泛型编程,看到利用模板进行数组传递,由此总结一下,以加深记忆.
在一般的情况下,当我们定义
int x[500]; 那么我们总可以通过 sizeof(x)/sizeof(int)得到500这个值,但是传到子函数后,我们就无法得到这个数组的实际长度.
方法 1:
void func(int arr[], const int size) ;
因为对数组的处理其实是指针,无法从数组本身获得其长度,所以在参数列表中加入一个size来表示该数组长度
方法 2:
void func(int *arr, const int size) ;
同方法一,只不过干脆变成了指针的形式。 这些都是传统的c模式下的函数定义方式
数组引用:
象如下定义就得到一个数组的引用
类型名 (&变量明)[N];
方法3 :
void func (int (&arr)[10] ) ;
使用数组引用作为参数。 这样的好处是数组长度是固定的,实参数组的长度必须与虚参数组的长度一致,否则编译会报错。这样作的坏处是,实参长度被限制,缺少了灵活性。 所以有了方法4
需要说明:VC++6.0根本就不支持模板,,,VS2005支持.所以如果要测试以下代码必须用VS2005,否则会报错.
这让我花了点时间.
方法4, 使用函数模版:
template <int size>
void func(int (&arr)[size]) ;
这样在调用模版的时候再以常量指定size值,充分有了灵活性
方法5, 使用无引用的函数模版 ---??
template <int size>
void func(int arr[size]) ; //其实在函数参数中的size是不起作用的
Example:
template < class T, size_t N >
void array_init( T (&x)[N])
{
for( size_t i = 0; i != N; i++)
{
x[i] = 0;
}
}
void main()
{
int x[]={1,2,3,4,5,6,7,8,9};
array_init(x);
}
近日初涉泛型编程,看到利用模板进行数组传递,由此总结一下,以加深记忆.
在一般的情况下,当我们定义
int x[500]; 那么我们总可以通过 sizeof(x)/sizeof(int)得到500这个值,但是传到子函数后,我们就无法得到这个数组的实际长度.
方法 1:
void func(int arr[], const int size) ;
因为对数组的处理其实是指针,无法从数组本身获得其长度,所以在参数列表中加入一个size来表示该数组长度
方法 2:
void func(int *arr, const int size) ;
同方法一,只不过干脆变成了指针的形式。 这些都是传统的c模式下的函数定义方式
数组引用:
象如下定义就得到一个数组的引用
类型名 (&变量明)[N];
方法3 :
void func (int (&arr)[10] ) ;
使用数组引用作为参数。 这样的好处是数组长度是固定的,实参数组的长度必须与虚参数组的长度一致,否则编译会报错。这样作的坏处是,实参长度被限制,缺少了灵活性。 所以有了方法4
需要说明:VC++6.0根本就不支持模板,,,VS2005支持.所以如果要测试以下代码必须用VS2005,否则会报错.
这让我花了点时间.
方法4, 使用函数模版:
template <int size>
void func(int (&arr)[size]) ;
这样在调用模版的时候再以常量指定size值,充分有了灵活性
方法5, 使用无引用的函数模版 ---??
template <int size>
void func(int arr[size]) ; //其实在函数参数中的size是不起作用的
Example:
template < class T, size_t N >
void array_init( T (&x)[N])
{
for( size_t i = 0; i != N; i++)
{
x[i] = 0;
}
}
void main()
{
int x[]={1,2,3,4,5,6,7,8,9};
array_init(x);
}