繁体   English   中英

使用指针在C ++中传递标量和数组数据

[英]Passing scalar and array data in C++ with pointers

我已经在FORTRAN中编程多年,并且正在尝试学习C ++并将某些旧程序转移到C ++。 我需要能够在函数中创建一个数组,然后使用指针将其作为变量传递回主程序,而不是像传统的C ++那样将其作为值传输。 我在这个问题中包括一个示例,其中创建了变量*var1*varr*array ,并将数据传递回主程序,并且该程序可以正常工作。 但是,如果我将*array转换为*array[1]或具有多个值的更大尺寸的数组,则该程序将无法运行。 可以在C ++中完成此操作,还是我必须将此功能合并到主程序中,以便数据可以在主程序中使用? 任何帮助将不胜感激!

第一个例子(这个可行)

#include<iostream>
using namespace std;
void test(int *var1,int *varr, int *array);

int main()
{
    int var,var2,array1;
    test(&var,&var2,&array1);
    cout << var << "\n";
    cout << var2 << "\n";
    cout << array1 << "\n";
    return 0;
}

void test(int *var1, int *varr, int *array)
{
    *var1=20;
    *varr=30;
    *array=15;
}

第二个示例(此示例无效)

#include<iostream>
using namespace std;
void test(int *var1,int *varr, int *array[1]);

int main()
{
    int var,var2,array1[1];
    test(&var,&var2,&array1[1]);
    cout << var << "\n";
    cout << var2 << "\n";
    cout << array1 << "\n";
    return 0;
}

void test(int *var1, int *varr, int *array[1])
{
    *var1=20;
    *varr=30;
    *array[1]=15;
}

第二个程序有几个错误:

首先,测试功能的原型:

void test(int *var1,int *varr, int *array[1]);

请记住,当您声明“ int array [SIZE]”时, array已经是一个指针,因此,如果您的函数采用“ int *array[1] ”,则实际上是将指针“ **int ”作为参数”。

声明要执行的操作的“正确”( 末尾为注释 )是:

void test(int* var1,int* varr, int array[1]); 

这等效于:

void test(int* var1, int* varr, int* array); 

其次,在这里:

test(&var,&var2,&array1[1])

&array1 [1]的作用是将位置“ 2”处的值(记住数组从位置0开始)传递给函数,因为您要取消引用该位置处的数组元素,所以我认为您真正想知道的是是,将数组作为参数传递,应该这样进行:

test(&var,&var2, array1);

数组在传递给函数时会转换为指针。 然后,在方法内部,您可以只是赋值:

array[1]=15;

这将是最终的工作代码:

#include<iostream>
using namespace std;
void test(int *var1,int *varr, int array[1]);

int main()
{
    int var,var2,array1[1];
    test(&var,&var2, array1);
    cout << var << "\n";
    cout << var2 << "\n";
    cout << array1[1] << "\n";
    return 0;
}

void test(int *var1, int *varr, int array[1])
{
    *var1=20;
    *varr=30;
    array[1]=15;
}

作为提示(因为您从C ++开始),您应该在声明变量后立即初始化所有变量,否则它们将包含垃圾:

int var  = 0;
int var2 = 0;
int array1[] = { 0, 0};

例如。

尝试远离C-Style数组,并使用STL提供的容器,例如vector:

http://www.cplusplus.com/reference/vector/vector/

int var,var2,array1[1];

关于array1 ,此声明等效于:

int array1[1];

这意味着一个整数数组。 您可以使用以下语法访问每个整数:

array1[x]; // this is an int

因此,当你写

&array[1];

您正在有效地检索int - int*的地址,该地址在许多方面与功能test的最后一个参数的类型不兼容。

但是,可以通过适当地修改函数声明来完成您打算做的事情:

test(&var1, &var, &array1);

void test(int *var1, int *varr, int (*arrayptr)[1]) // arrayptr is a pointer to an array of 1 integer
{
  (*arrayptr)[0] = 15; // assign 15 to the first integer of the array pointed to by arrayptr.
}

请记住,在C / C ++中,索引从0开始-如果要到达数组的第一个整数,则需要写入array[0]而不是array[1]

但是,这是一种非常尴尬的方式,尤其是在C ++中-您可能希望使用具有更简单方法的vector

#include <vector>
#include <iostream

int main()
{
  std::vector<int> myVector(1); // A vector is a class that encapsulates a dynamic array. Here, I create a vector with 1 pre-allocated element.

  test(myVector);
  std::cout << myVector[0] << std::endl;
}

void test(std::vector<int> &referenceToMyVector)
{
  referenceToMyVector[0] = 15;
}

以下test使您可以在函数中动态创建数组。

#include<iostream>
using namespace std;

void test(int *&a);

int main()
{
    int *a = NULL;
    test(a);
    cout << a[0] << endl;
    delete a;
    return 0;
}

void test(int *&a)
{
    a = new int [3];
    a[0] = 3;
}

但是我怀疑您是否真的需要它,因为您使用的是C ++,为什么不考虑使用vector

#include <iostream>
#include <vector>
using namespace std;

void foo(vector<int> &a)
{
    a.push_back(3);
}

int main()
{
    vector<int> a;
    foo(a);
    cout << a[0] << endl;
    return 0;
}

更新

假设您的文件格式为:

int1 int2 int3

要么

int1
int2
int3

#include <string>
#include <ifstream>
#include <vector>

void foo(const std::string &filename, std::vector<int> &v)
{
    std::ifstream in(filename);
    int a;
    while (in >> a) v.push_back(a);
    in.close()
}
#include<iostream>
using namespace std;
void test(int *var1,int *varr, int *array);

int main()
{
    int var,var2,array1[10];
    test(&var,&var2,array1);
    cout << var << "\n";
    cout << var2 << "\n";
    cout << array1[1] << "\n";
    return 0;
}

void test(int *var1, int *varr, int *array)
{
    *var1=20;
    *varr=30;
    array[0]=15;
    array[1] = 16;
    array[2] = 17;
}

$ ./每年

20

30

16

暂无
暂无

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

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