在函数中创建值,然后将指针保存在全局指针数组中的值上

时间:2016-03-24 21:19:28

标签: c++ arrays pointers

我对c ++比较陌生,习惯于Java(我更喜欢)。 我这里有一些指针问题。我创建了一个最小程序来模拟更复杂的程序的行为。

这是代码:

void test (int);
void test2(int*);

int* global [5];    //Array of int-pointer

int main(int argc, char** argv) {
    int z = 3;
    int y = 5;      
    cin >> z;       // get some number
    global[0] = &y; // global 0 points on y

    test(z);        // the corpus delicti

    //just printing stuff
    cout << global[0]<<endl;   //target address in pointer
    cout << &global[0]<<endl;  //address of pointer
    cout << *global[0]<<endl;  //target of pointer

    return 0; //whatever
}


//function doing random stuff and calling test2
void test (int b){
    int i = b*b;
    test2(&i);
    return;
}

//test2 called by test puts the address of int i (defined in test) into global[0]
void test2(int* j){
   global[0]= j; 
}

棘手的部分是test2。我将我在test中创建的变量的地址放入全局指针数组中。不幸的是,这个程序给了我一个编译器错误:

main.cpp: In function 'int test(int)':
main.cpp:42:20: error: 'test2' was not declared in this scope
     return test2(&i);
                    ^

我在这里找不到任何范围问题。我尝试将测试的int i更改为全局变量,但它没有帮助,所以我想,这不是原因。

编辑:它现在编译,但为cin = 20提供了错误的值。 * global [0]应该是400,但是是2130567168.它似乎不是一个int / uint问题。距离2,14e9太远了。 Edit2:输入值无关紧要。

3 个答案:

答案 0 :(得分:3)

'test2' was not declared in this scope这是因为编译器不知道test2是什么。你需要在main上面添加一个函数原型。

void test (int b);
void test2(int& j);

或只是:

void test (int);
void test2(int&);

因为此时编译器只需知道参数的类型而不知道它们的名称。

编辑:将函数定义移到main之上而不添加原型也可以,但最好使用原型。

答案 1 :(得分:1)

在调用函数之前,编译器必须知道它。

因此,您要重新排列函数定义,使test2先到,test秒和main最后,或者您放置test2test1的声明在main之前:

void test2(int& j); // declaration
void test(int b);   // declaration

int main(int argc, char** argv) {
    // ...
}

void test(int b){ // definition
    // ...
}

void test2(int& j) { // definition
    // ...
}

这将揭示更严重的错误;您使用test2致电int*,但预计会int&。您可以将呼叫转为test2(i);

来解决此问题

将函数巧妙地分成声明和定义之后,就可以执行典型C ++源文件管理的下一步:将声明放入头文件(通常是*.h*.hpp)和#include来自包含*.cpp的实施文件(通常为main)。然后为这两个函数定义添加两个实现文件。也在那里添加相应的#include。不要忘记在标题中包含警戒。

最后,分别编译三个实现文件,并使用链接器从三个结果对象文件中创建可执行文件。

答案 2 :(得分:0)

你需要在调用之前声明test2。每个函数都需要在调用之前声明。

在main上面添加这些行以声明函数;

void test2(int& j);
void test2(int& j);

int main(){...}