用指针在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;
}
#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;
}
$ ./a.o ut
20 3016第二个程序有几个错误:
首先,测试函数的原型:
void test(int *var1,int *varr, int *array[1]);
请记住,当你声明"int array[SIZE]"时,array
已经是一个指针,所以如果你让你的函数接受"int *array[1]
",实际上是接受指针"**int
"的指针作为参数。
声明你想要做什么的"正确"(在末尾的read注释)的方式是:
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风格的数组,使用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()
}
- Mongodb c++驱动程序:如何查询元素的数组
- 将数组的地址分配给变量并删除
- 从C++本机插件更新Vector3数组
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 数组索引的值没有增加
- 将对象数组的引用传递给函数
- 为char数组调整zlib-zpipe
- 2D数组来自文本输入,中间有空格
- std::向量与传递值的动态数组
- 在c++中用vector填充一个简单的动态数组
- 使用strcpy将char数组的元素复制到另一个数组
- 使用指针从C++中的数组中获取最大值
- C++使用整数的压缩数组初始化对象
- 特征:从数组类型中获取标量类型是否记录?
- 标量"新 T "与数组"新 T[1]"
- 在结构中使用struct数组时,标量初始化器周围的牙套
- 为什么对Aligned STD ::数组的初始自动矢量载荷是标量?(g /clang )
- 需要一个通用析构函数来删除标量以及指针数组
- 检查数组是否为标量类型