难以使用指针

时间:2014-01-23 00:00:30

标签: c++ arrays pointers reference

在初始化指针时遇到了一些问题。

void findMM (int *PMM, int *theG)
{
        // code  I haven't written yet. It will essentially take two variables from   //theG and store it in MM  
}

int main() 
{ 
    int size;
    int MM [2] = {1000, 0}; 
    int *theG = NULL; 
    cout << "\nPlease insert size of array:" << endl; 
    cin >> size; 
    theG = new int [size];  
    findMM(&MM, &theG); //Get error with &MM  
    delete [] theG;     
    return 0; 
}

编译器说类型int (*)[2]的参数与类型int **的参数不兼容所以很明显我对代码特别是我的(引用?)数组MM有问题。或者也许还有其他明显的错误我错过了?

编辑尝试2

void findMM (int *PMM, int *theG)
{
        PMM [1] = 5; 
        theG [0] = 7; 
}

int main() 
{ 
    int size;
    int MM [2] = {1000, 0}; 
    int *theG = NULL; 
    cout << "\nPlease insert size of array:" << endl; 
    cin >> size; 
    theG = new int [size];  
    findMM(MM, theG);
    cout << MM [1] << endl << theG[0];    
    delete [] theG;     
    return 0; 
}

输出是5和7是否正确?

2 个答案:

答案 0 :(得分:3)

由于MM是一个数组,&MM是一个指向数组的指针(这是您在错误中看到的类型int (*)[2])。相反,您似乎想要将指针传递给数组的第一个元素。有两种方法可以做到这一点。首先,您可以显式获取第一个元素,然后获取它的地址:&MM[0]。其次,您可以依靠数组到指针的转换来为您完成并只传递MM。数组到指针的转换将数组转换为指向其第一个元素的指针。

答案 1 :(得分:1)

我知道这个问题已经得到解答,但我相信我可以为提问者的理解做出贡献。

让我们从基础知识开始:

void main()
{
    int a = 2; // a is an int
    cout << a << endl; // print 2

    int *b; // b is a pointer-to-int
    b = &a; // store the address of a in b
    cout << *b << endl;// print the value that b points to, which is 2

    int my_array = new int[3]; // allocate an array with 3 integers
    my_array[0] = 50; // store 50 in the first element of the array
    my_array[1] = 51; // store 51 in the second element of the array
    my_array[2] = 52; // store 52 in the third element of the array
    cout << c[0] << endl; // print 50

    some_function(my_array, 3); // explained below
}

现在让我们看看如何将数组传递给函数。假设我们想要一个名为some_function的函数来接收一个数组。

void some_function(int *some_array, int size_of_the_array)
{
    // use the array however you like here
}

函数some_function接收指向int的指针(也称为“指向int的指针”)。数组的名称始终是其第一个元素的地址,因此如果函数需要指向int的指针并且您为其指定int数组的名称,那么您实际上是在给它数组中第一个元素的地址(这只是C ++语法规则)。所以函数现在有了数组中第一个元素的地址,它可以像*some_array那样访问数组中的第一个元素,但是如果要访问其他元素呢?它将已有的指针加1,然后将*运算符应用于它:*(some_array + 1)。假设int为4个字节,如果向指向int的指针添加1,则此添加的结果是一个新指针,指向内存中4个字节的内存位置,因此*(some_array + 93)是数组some_array的第94个元素中的值(数组元素按顺序存储在内存中)。对此的简写表示法是some_array[93]。因此,如果您有int *some_array = new int[100];,则some_array是指针,some_array[93]*(some_array + 93)相同,这是数组中的第94个元素。

虽然地址本身还不够,但您还需要知道数组中的条目数,这样您就不会尝试访问数组末尾的元素。在这个例子中,假设some_function只是打印数组的内容,所以如果你不提供3作为函数的第二个参数,那么它将无法知道何时停止向指针添加1它收到了第一个论点。但要注意,通过以这种方式将数组传递给函数,您不会将函数传递给数组的副本,而只是告诉它在内存中找到其内容的位置。