相关疑难解决方法(0)

为什么引用数组是非法的?

以下代码无法编译.

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 &模拟引用数组.

c++ arrays reference

135
推荐指数
8
解决办法
9万
查看次数

C++通过引用传递数组

这是允许通过引用传递数组?

 void foo(double& *bar) 
Run Code Online (Sandbox Code Playgroud)

似乎我的编译器说没有.为什么?通过引用传递数组的正确方法是什么?还是一个解决方法?我有一个数组参数,我的方法应该修改,然后我应该检索.或者,我可以使这个数组成为一个类成员,它工作正常,但它对我的代码的其他部分有很多缺点(我想避免).

感谢致敬.

c++ arrays pointers reference pass-by-reference

62
推荐指数
4
解决办法
13万
查看次数

有关引用数组参数的用处是什么?

我最近发现了一些这样的代码:

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)

我发现了一个问题,询问如何传递对数组的引用.我猜我在问为什么.

此外,只有一个答案 "何时指向数组的指针有用?" 讨论了函数参数,所以我不认为这是一个重复的问题.

c++ arrays pass-by-reference

24
推荐指数
3
解决办法
1万
查看次数

将数组作为C++中方法的const参数传递

我希望能够将const数组参数传递给C++中的方法.

我知道当你将一个数组传递给方法时,它与将指针传递给数组的第一项是一样的,所以一种简单的方法就是使用指针.

void myMethod(int * const inTab)
Run Code Online (Sandbox Code Playgroud)

但是有一个数组有时会更好,你可以编写数组的大小.

c++ arrays methods arguments const

10
推荐指数
4
解决办法
3万
查看次数

我们可以使用 for-each 循环遍历传递给函数的数组吗?

我知道,我们可以通过这种方式遍历作为参数传递的数组:

    //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)

c++ arrays foreach loops

6
推荐指数
2
解决办法
196
查看次数

为什么数组的大小通过C++编译器已知的引用传递给函数?

我知道当我想将一个数组传递给一个函数时,它会衰减成指针,所以它的大小不会被知道,这两个声明是等价的:

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++ arrays pass-by-reference

5
推荐指数
1
解决办法
195
查看次数

从编译器的角度来看,如何处理数组的引用,以及为什么不允许传递值(不是衰减)?

我们知道,在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++ arrays compiler-construction assembly pointers

4
推荐指数
1
解决办法
202
查看次数

将数组传递给函数 - 指针与引用(C++与C)

关于将数组传递给函数的最佳实践,我有一个广泛的问题.

所以在过去我用C编程时我想要一个函数让它的输入是一个数组,我会声明函数输入参数是一个指针.这工作得相当好.

但是,我开始用C++编写更多内容,并试图确定将数组传递给函数的最佳实践.所以我注意到在C++中通过引用传递对象是很流行的,这样可以避免昂贵的复制操作.但是,当我谷歌将数组传递给函数时,我读到的语句表明数组是通过引用自动传递的......那么这个问题是什么呢?为什么数组会通过引用自动传递?让我们说我不希望函数修改数组,是否可以传递const数组?

我很难将我的测试程序编译好.所以我很好奇是否有人能解释将数组传递给C++中的函数意味着什么以及它与C的不同之处

谢谢!

c c++ arrays pointers function

1
推荐指数
1
解决办法
5045
查看次数

如何通过引用传递向量数组?

#include <vector>
using std::vector;

int main(void)
{
    vector<int> gr[10];

    function(gr);
}
Run Code Online (Sandbox Code Playgroud)

我应该如何定义通过引用而不是通过值调用的函数?

c++ c++11 c++14

1
推荐指数
2
解决办法
4457
查看次数

数组和指针的不同函数行为

我正在尝试为数组和指针开发一个具有不同行为的函数.可以通过部分特化来实现类,但它不适用于函数!

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)

c++ templates

0
推荐指数
1
解决办法
123
查看次数

在c ++中隐式传递数组的长度

我曾经看过代码(来自显然足够可靠的源代码,让我记住它),似乎传达了数组的长度,同时传递它们的功能(参见下面的示例):

void foo(int [m][n] array)
{
//m and n are the rows and columns of the array
//code
}
Run Code Online (Sandbox Code Playgroud)

然而,我无法找到这个来源,并开始怀疑我是否把它全部弄错了,也许,甚至想象它?有人可以评论吗?

c++ parameter-passing

0
推荐指数
1
解决办法
82
查看次数

如何在函数参数中通过引用获取数组?

如果数据类型是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)

c++

0
推荐指数
1
解决办法
78
查看次数

通过参考问题传递?

问题我试图将数组传递char arr[6] = {"1","2",etc.}给一个接受这样的参数的函数,void foo(char* &arr,...)但它不起作用.有人能解释一下吗?

c++ arrays reference

0
推荐指数
1
解决办法
62
查看次数