[英]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:
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.