簡體   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