C ++:通过引用传递数组
c++: passing arrays by reference
我正在尝试定义一个函数原型,它采用不同长度的 char
数组。我知道我必须通过引用传递数组以避免数组衰减到指向其第一个元素的指针。所以我一直在研究这个简单的例子来让我的理解正确。
#include <stdio.h> // size_t
//template to accept different length arrays
template<size_t len>
//pass array of char's by reference
void func(const char (&str)[len])
{
//check to see if the array was passed correctly
printf(str);
printf("\n");
//check to see if the length of the array is known
printf("len: %lu",len);
}
int main(){
//create a test array of chars
const char str[] = "test12345";
//pass by reference
func(&str);
return 0;
}
这给了我编译器错误:
main.cpp: In function ‘int main()’:
main.cpp:19:14: error: no matching function for call to ‘func(const char (*)[10])’
func(&str);
^
main.cpp:6:6: note: candidate: template<long unsigned int len> void func(const char (&)[len])
void func(const char (&str)[len])
^~~~
main.cpp:6:6: note: template argument deduction/substitution failed:
main.cpp:19:14: note: mismatched types ‘const char [len]’ and ‘const char (*)[10]’
func(&str);
我认为函数签名 func(const char (&str)[len])
指示指向长度 len
的 char
数组的指针,这是我传递的 func(&str)
。
我尝试了 func(str)
,我认为这是错误的,因为我传递的是值 str,而不是它的引用。但是,这确实有效,我不明白为什么。
这是怎么回事?
通过引用传递到底是什么意思?
您的函数声明正确,但您没有正确地将数组传递给它。
func(*str);
首先将数组衰减为指向第一个元素的指针,然后引用该指针,从而只将第一个字符传递给 func()
。但是没有定义func(char)
函数,所以这是一个错误。
func(&str);
获取数组的地址,从而传递一个指向数组的指针,而不是对它的引用。但是没有定义func(char(*)[len])
函数,所以这也是一个错误。
要通过引用传递 str
,您只需传递 str
as-is 而无需 *
或 &
:
func(str);
这与传递对任何其他类型变量的引用没有什么不同,例如:
void func(int &value);
int i;
func(i);
旁注:printf(str);
很危险,因为您不知道 str
中是否包含任何 %
个字符。更安全的调用是:
printf("%s", str);
或:
puts(str);
但是只有当 str
是 null-terminated(你的情况就是这样)时,这些才有效。更安全的是:
printf("%.s", (int)len, str);
不需要空终止符。
我正在尝试定义一个函数原型,它采用不同长度的 char
数组。我知道我必须通过引用传递数组以避免数组衰减到指向其第一个元素的指针。所以我一直在研究这个简单的例子来让我的理解正确。
#include <stdio.h> // size_t
//template to accept different length arrays
template<size_t len>
//pass array of char's by reference
void func(const char (&str)[len])
{
//check to see if the array was passed correctly
printf(str);
printf("\n");
//check to see if the length of the array is known
printf("len: %lu",len);
}
int main(){
//create a test array of chars
const char str[] = "test12345";
//pass by reference
func(&str);
return 0;
}
这给了我编译器错误:
main.cpp: In function ‘int main()’:
main.cpp:19:14: error: no matching function for call to ‘func(const char (*)[10])’
func(&str);
^
main.cpp:6:6: note: candidate: template<long unsigned int len> void func(const char (&)[len])
void func(const char (&str)[len])
^~~~
main.cpp:6:6: note: template argument deduction/substitution failed:
main.cpp:19:14: note: mismatched types ‘const char [len]’ and ‘const char (*)[10]’
func(&str);
我认为函数签名 func(const char (&str)[len])
指示指向长度 len
的 char
数组的指针,这是我传递的 func(&str)
。
我尝试了 func(str)
,我认为这是错误的,因为我传递的是值 str,而不是它的引用。但是,这确实有效,我不明白为什么。
这是怎么回事? 通过引用传递到底是什么意思?
您的函数声明正确,但您没有正确地将数组传递给它。
func(*str);
首先将数组衰减为指向第一个元素的指针,然后引用该指针,从而只将第一个字符传递给 func()
。但是没有定义func(char)
函数,所以这是一个错误。
func(&str);
获取数组的地址,从而传递一个指向数组的指针,而不是对它的引用。但是没有定义func(char(*)[len])
函数,所以这也是一个错误。
要通过引用传递 str
,您只需传递 str
as-is 而无需 *
或 &
:
func(str);
这与传递对任何其他类型变量的引用没有什么不同,例如:
void func(int &value);
int i;
func(i);
旁注:printf(str);
很危险,因为您不知道 str
中是否包含任何 %
个字符。更安全的调用是:
printf("%s", str);
或:
puts(str);
但是只有当 str
是 null-terminated(你的情况就是这样)时,这些才有效。更安全的是:
printf("%.s", (int)len, str);
不需要空终止符。