繁体   English   中英

将数组传递给函数C ++

[英]Passing an array into a function c++

所以我在将整个直方图数组传递到C ++中的函数时遇到问题

这样声明数组

TH1F *h_Energy[2];
h_Energy[0] = new TH1F("h1", "h1", 100, 0, 100);
h_Energy[1] = new TH1F("h2", "h2", 100, 0, 100);

这是我要在函数中执行的操作:

void overlayhists(TH1 *hists, int numhists) {
    int ymax = 0;
    for (int i=0; i<numhists; i++) {
        if (hist[i].GetMaximum() > ymax) {
            ymax = (hist[i].GetMaximum())*1.05;
        }
     }
}

我正在向函数传递这样的数组

overlayhists(*h_Energy, 2);

其中h_Energy是具有2个元素的一维数组。 该代码将在循环中的第一个直方图中运行,但是一旦它开始第二个循环并尝试在第二次尝试中访问hist [i] .GetMaximum()则将其分段。

是什么赋予了?

这将创建一个指针数组以键入TH1F

TH1F *h_Energy[2]; //edited after OP changed 

如果要使用此方法,然后将其作为参数传递,则必须首先对其进行初始化,然后创建函数原型以适应:

void overlayhists(TH1F **hists, int numhists);  
                      ^^

根据上面显示的内容,您将这样称呼它:(初始化之后)

h_Energy[0] = new TH1F("h1", "h1", 100, 0, 100);
h_Energy[1] = new TH1F("h2", "h2", 100, 0, 100);

overlayhists(h_Energy, 2);

1.将任何数组传递给c ++函数以更改内容:

请参考以下代码片段:

//调用:

int nArr[5] = {1,2,3,4,5};

Mul(nArr, 5);

每当将数组传递给函数时,实际上就将指针传递给数组的第一个元素。 这对于C ++和C是隐式的。但是,如果您传递正常值(非数组),则它将被视为按值传递。


//函数Mul()的声明和定义

void MUl(int* nArr, size_t nArrSize){

 size_t itr = 0;

 for(;itr<nArrSize; itr++)
      nArr[i] = 5*nArr;// here we've coded to multiply each element with 5
}

2.将任何Ptr传递给c ++中的函数以更改指向的指针:

现在让我们假设我们想将nArr(从上面的代码片段中)复制到另一个数组,例如nArrB

初学者最好的方法是使用对指针的引用。 您可以传递对函数指针的引用///

int nArr[5] = {1,2,3,4,5}; int *nArrB;

在这里,我们不知道nArrB的大小。 要将nArr复制到nArrB,我们必须传递nArr,指向nArrB的指针的地址(或指向nArrB的指针或指向nArrB的指针的引用)和数组的大小。 这是实现。

//调用

CopyNArr(nArr, &nArrB, 5);


//函数实现

void CopyNArr(int* nArr, int* & nArrB, size_t nArrSize) {

// dymanically allocating memory size for array. Assuming 4 byte int size

 nArrB = new int[nArrSize*4];
 size_t itr = 0;
 //Copying values
 for(;itr<nArrSize; itr++)
      nArrB[i] = nArr[i];

}

//复制后,nArrB指向5个元素数组的第一个元素。


希望对您有所帮助。 写进一步的澄清。

您有一个大小为2的数组,但是您仅创建了一个元素。 而且那个索引错误。 数组索引从0开始。

元素应位于h_histogram[0]h_histogram[1]

很抱歉,如果这个答案完全无关紧要,但我很想发布。 这些是我在看到您的问题后所做的实验。

#include<iostream>
using namespace std;
main()
{
int e[2]={0,1};
int *p[2];
int i;
/*
  Printing the array e content using one pointer
  from an array of pointers. Here I am not using p[2]
  at all.
*/
p[1]=e;
cout<<"Elements of e are : \n";
for(i=0;i<2;i++)
{
cout<<*(p[1]+i)<<endl;
/*
In the above line both *((*p)+i) and *(p+i)
won't serve the purpose of printing the array values.
*/
}
/*Printing the array e content using pointer to array*/
cout<<"Elements of e are : \n";
for(i=0;i<2;i++)
{
cout<<*(e+i)<<endl;
}
/*Note that pointer to array is legal but array TO pointer
(don't confuse with array OF pointers) is not.*/
}

希望这会刷新您的理解。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM