以下代码无法编译.
int a = 1, b = 2, c = 3;
int& arr[] = {a,b,c,8};
Run Code Online (Sandbox Code Playgroud)
C++标准对此有何看法?
我知道我可以声明一个包含引用的类,然后创建该类的数组,如下所示.但我真的想知道为什么上面的代码不能编译.
struct cintref
{
cintref(const int & ref) : ref(ref) {}
operator const int &() { return ref; }
private:
const int & ref;
void operator=(const cintref &);
};
int main()
{
int a=1,b=2,c=3;
//typedef const int & cintref;
cintref arr[] = {a,b,c,8};
}
Run Code Online (Sandbox Code Playgroud)
可以使用struct cintref而不是const int &模拟引用数组.
这是允许通过引用传递数组?
void foo(double& *bar)
Run Code Online (Sandbox Code Playgroud)
似乎我的编译器说没有.为什么?通过引用传递数组的正确方法是什么?还是一个解决方法?我有一个数组参数,我的方法应该修改,然后我应该检索.或者,我可以使这个数组成为一个类成员,它工作正常,但它对我的代码的其他部分有很多缺点(我想避免).
感谢致敬.
我最近发现了一些这样的代码:
typedef int TenInts[10];
void foo(TenInts &arr);
Run Code Online (Sandbox Code Playgroud)
你能做些什么foo()是有用的,如果宣言是:
void foo(int *arr); // or,
void foo(int arr[]); // or,
void foo(int arr[10]); // ?
Run Code Online (Sandbox Code Playgroud)
我发现了一个问题,询问如何传递对数组的引用.我猜我在问为什么.
此外,只有一个答案 "何时指向数组的指针有用?" 讨论了函数参数,所以我不认为这是一个重复的问题.
我希望能够将const数组参数传递给C++中的方法.
我知道当你将一个数组传递给方法时,它与将指针传递给数组的第一项是一样的,所以一种简单的方法就是使用指针.
void myMethod(int * const inTab)
Run Code Online (Sandbox Code Playgroud)
但是有一个数组有时会更好,你可以编写数组的大小.
我知道,我们可以通过这种方式遍历作为参数传递的数组:
//NO ERROR
void fun(int *a, int n){
for(int i=0; i<n; i++)
cout<<a[i];
}
Run Code Online (Sandbox Code Playgroud)
但是,有没有什么办法可以在这样的函数中使用 for-each 循环遍历数组?
//ERROR
void fun(int *a, int n){
for(auto x:a)
cout<<x;
}
Run Code Online (Sandbox Code Playgroud) 我知道当我想将一个数组传递给一个函数时,它会衰减成指针,所以它的大小不会被知道,这两个声明是等价的:
void funtion(int *tab, int size);
Run Code Online (Sandbox Code Playgroud)
和
void funtion(int tab[], int size);
Run Code Online (Sandbox Code Playgroud)
我理解为什么.但是,当我传递一个数组作为参考时,我检查过:
void funtion(int (&tab)[4]);
Run Code Online (Sandbox Code Playgroud)
编译器将知道数组的大小,并且不允许我传递不同大小的数组作为此函数的参数.
这是为什么?我知道当我按地址传递数组时,在计算数组中第i个元素的位置时不会考虑大小,所以即使我在函数声明中明确地包含它,它也会被丢弃:
void funtion(int tab[4], int size);
Run Code Online (Sandbox Code Playgroud)
但是当我通过引用传递数组时有什么不同?为什么编译器知道它的大小?
注意:我对编译时已知大小的数组感兴趣,所以我没有使用任何模板.
我在Stack Overflow上发现了类似的问题,但它没有回答我的问题 - 它没有解释为什么编译器知道数组的大小,只有一些关于如何将数组传递给函数的信息.
我们知道,在C++中,我们可以将数组的引用作为参数传递f(int (&[N]).是的,它是iso标准保证的语法,但我很好奇编译器如何在这里工作.我找到了这个帖子,但遗憾的是,这并没有回答我的问题 - 编译器如何实现这种语法?
然后我写了一个演示,希望从汇编语言中看到一些东西:
void foo_p(int*arr) {}
void foo_r(int(&arr)[3]) {}
template<int length>
void foo_t(int(&arr)[length]) {}
int main(int argc, char** argv)
{
int arr[] = {1, 2, 3};
foo_p(arr);
foo_r(arr);
foo_t(arr);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
最初,我猜它仍会衰减到指针,但会通过寄存器隐式传递长度,然后转回函数体中的数组.但汇编代码告诉我这不是真的
void foo_t<3>(int (&) [3]):
push rbp #4.31
mov rbp, rsp #4.31
sub rsp, 16 #4.31
mov QWORD PTR [-16+rbp], rdi #4.31
leave #4.32
ret #4.32
foo_p(int*):
push rbp #1.21
mov rbp, rsp #1.21
sub rsp, 16 #1.21
mov QWORD …Run Code Online (Sandbox Code Playgroud) 关于将数组传递给函数的最佳实践,我有一个广泛的问题.
所以在过去我用C编程时我想要一个函数让它的输入是一个数组,我会声明函数输入参数是一个指针.这工作得相当好.
但是,我开始用C++编写更多内容,并试图确定将数组传递给函数的最佳实践.所以我注意到在C++中通过引用传递对象是很流行的,这样可以避免昂贵的复制操作.但是,当我谷歌将数组传递给函数时,我读到的语句表明数组是通过引用自动传递的......那么这个问题是什么呢?为什么数组会通过引用自动传递?让我们说我不希望函数修改数组,是否可以传递const数组?
我很难将我的测试程序编译好.所以我很好奇是否有人能解释将数组传递给C++中的函数意味着什么以及它与C的不同之处
谢谢!
#include <vector>
using std::vector;
int main(void)
{
vector<int> gr[10];
function(gr);
}
Run Code Online (Sandbox Code Playgroud)
我应该如何定义通过引用而不是通过值调用的函数?
我正在尝试为数组和指针开发一个具有不同行为的函数.可以通过部分特化来实现类,但它不适用于函数!
int i = 0;
some_func( &i ); // pointer
int arr[ 3 ] = { 0 };
some_func( arr ); // array
Run Code Online (Sandbox Code Playgroud)
在第二种情况下,函数some_func参数类型是int*,并且没有办法找出它实际上int[3].
另一方面,如果我使用类模板特化,我必须明确指定数组类型:
template< typename T >
struct S
{
static void some_func( T t ) { ... }
};
template< typename T, size_t N >
struct S< T[ N ] >
{
static void some_func( T t[ N ] ) { ... }
};
// ...............
int arr[ 3 ] = …Run Code Online (Sandbox Code Playgroud) 我曾经看过代码(来自显然足够可靠的源代码,让我记住它),似乎传达了数组的长度,同时传递它们的功能(参见下面的示例):
void foo(int [m][n] array)
{
//m and n are the rows and columns of the array
//code
}
Run Code Online (Sandbox Code Playgroud)
然而,我无法找到这个来源,并开始怀疑我是否把它全部弄错了,也许,甚至想象它?有人可以评论吗?
如果数据类型是typedef,如何通过引用传递数组.我正在学习c ++,我阅读了call-by-reference的概念,但是当我按照那个实现时 - 我收到了一个错误(在代码之后粘贴在下面).请问,任何人都可以解释发送数组作为参考调用的最佳方式吗?
#include <iostream>
#include <vector>
using namespace std;
typedef unsigned long ulong;
ulong fib_dynamic(ulong n, ulong &memo[]){
if(n < 2) return 1;
if(memo[n] == 0){
memo[n] = fib_dynamic(n-1, memo) + fib_dynamic(n-2, memo);
}
return memo[n];
}
ulong fib_iterative(ulong n){
ulong fib[n+1];
fib[0] = 1;
fib[1] = 1;
for(int i=2; i<n; i++) {
fib[i] = fib[i-1] + fib[i-2];
}
return fib[n-1];
}
int main(){
ulong n;
cout << "Welcome to Fib Calculator\nEnter the n:";
cin >> n;
ulong …Run Code Online (Sandbox Code Playgroud) 问题我试图将数组传递char arr[6] = {"1","2",etc.}给一个接受这样的参数的函数,void foo(char* &arr,...)但它不起作用.有人能解释一下吗?