当前位置: 首页 > 知识库问答 >
问题:

使用引用作为数组/指针是合法的C++吗?

左丘恩
2023-03-14

我的团队(包括我自己)是C++的新手。我们新开发的一部分是一个C++函数,它需要与一个以数组为输入的C函数进行接口。为了实现这一点,创建了类似于以下构造:

#include "stdio.h"

void the_c_function(double *array, int len)
{
   for (int i = 0; i < len; i++)
   {
      printf("%d: %g\n", i, array[i]);
   }
}

void the_cpp_wrapper(double& dref, int len)
{
   the_c_function(&dref, len);
}

int main()
{
   const int LEN = 4;
   double dbl_array[LEN] = { 3,4,5,6 };
   the_cpp_wrapper(dbl_array[0], LEN);
   return 0;
}

编译时,这将按照预期工作:它打印数组的内容:

0: 3
1: 4
2: 5
3: 6

但我觉得这很不合法,或者最多是应该劝阻的事情。

这是合法的C++,即是否保证指向数组引用的指针指向原始数组?

有什么理由可以这样做,而不是直接使用指针,而不是将引用作为中间的引用?

共有1个答案

蒙经纶
2023-03-14

我的团队(包括我自己)是C++的新手。...

[...]

…应该劝阻的事情。

您现在应该养成使用标准C++库的习惯,在您的情况下,最好的选择是std::vector:

#include <stdio.h>
#include <stdlib>
#include <vector>

void the_c_function(const double *array, size_t len) {/*...*/}
void the_cpp_wrapper(const std::vector<double>& v)
{
   the_c_function(v.data(), v.size());
}
// ----------------------------
int main()
{
   const std::vector<double> dbl_array { 3,4,5,6 };
   the_cpp_wrapper(dbl_array);
   return EXIT_SUCCESS;
}

对于const double*double*,C++有意希望您使用更详细的const_cast 来丢弃const-ness。

如果您希望使用C++“全面”,可以使用模板使the_cpp_wrapper()更通用一些:

template<typename TSpan>
void the_cpp_wrapper(const TSpan& v)
{
   the_c_function(v.data(), v.size());
}

使用此代码,您可以将任何内容传递给具有data()size()方法_cpp_wrapper。(请注意,tspan“可以”为std::span ,这可能会导致一些晦涩难懂的编译器错误;有一些方法可以修复,但更多的是C++。)

与您的具体问题没有直接关系,但您可能会发现std::span也很有用。

 类似资料:
  • 问题内容: 搜索字符串时,如何使用针阵列?例如: 因为当使用它时,它不起作用,如果有这样的东西,那会很好 问题答案: function strposa($haystack, $needles=array(), $offset=0) { $chr = array(); foreach($needles as $needle) { $res = strpos($haystack, $needle, $

  • 本文向大家介绍在C中使用指针算法的数组总和,包括了在C中使用指针算法的数组总和的使用技巧和注意事项,需要的朋友参考一下 在此程序中,我们需要使用指针算法来查找数组元素的总和。 在这里,我们使用*表示存储在内存地址中的值,并且该地址将保留存储在变量中。因此,“ int * ptr”表示ptr是包含地址的变量,并且地址的内容是整数。 * p表示它是一个指针变量。使用此方法,我们将找出数组元素的总和。

  • C++ 指针 在我们讲解指针数组的概念之前,先让我们来看一个实例,它用到了一个由 3 个整数组成的数组:#include <iostream> using namespace std; const int MAX = 3; int main () { int var[MAX] = {10, 100, 200}; for (int i = 0; i < MAX; i++) { cout << "Va

  • C++ 数组 您可以先跳过本章,等了解了 C++ 指针的概念之后,再来学习本章的内容。 如果您对 C++ 指针的概念有所了解,那么就可以开始本章的学习。数组名是一个指向数组中第一个元素的常量指针。因此,在下面的声明中: double balance[50]; balance 是一个指向 &balance[0] 的指针,即数组 balance 的第一个元素的地址。因此,下面的程序片段把 p 赋值

  • 大佬们,这样写在c++中会产生什么问题啊?

  • 我创建了一个名为InputControl的类。我正在使用一个名为GLFW的库和一个函数glfwsetkeycallback。该函数定义为: E0167“void(inputcontrol::*)(GLFWwindow*window,int key,int scancode,int action,int mods)”类型的参数与“GLFWKeyFun”类型的参数不兼容