直接从指针/地址访问数组的元素

时间:2017-06-22 11:02:21

标签: c++ arrays pointers

我想:

  • 将一个指向int数组的指针传递给方法
  • 使用方法中的值
  • 在方法中调整数组大小,
  • 然后继续在方法外使用数组。

我的方法声明有func(int ** arr_address),我把这个方法称为func(& arr)。实现此目的的一种方法是在我的方法中分配局部变量,但这看起来很笨拙。我试图使用的方法是直接访问数组元素,如* arr_address [1],但这似乎将[1]偏移应用于指针的内存地址,而不是数组数据开始的地址在记忆中。

这是一个带有输出的简单程序,用于说明两种不同的方法:

#include <iostream>
#include <stdlib.h>

void func(int** arr1_address, int** arr2_address)
{
    int* arr1_local = *arr1_address;

    arr1_local[1]=2;     // Works
    *arr2_address[1]=22; // (*) Writes to position 0 of wrong array!

    // These realloc() calls were incorrect in the original question
    //arr1_address = (int**)realloc(*arr1_address, 3*sizeof(int));
    //arr2_address = (int**)realloc(*arr2_address, 3*sizeof(int));
    *arr1_address = realloc(*arr1_address, 3*sizeof(int));
    *arr2_address = realloc(*arr2_address, 3*sizeof(int));

    //arr1_local[2] = 3;
    //*arr2_address[2] = 33;
}

int main()
{
    int* arr1;
    int* arr2;

    arr1 = (int*)calloc( 2, sizeof(int) );
    arr2 = (int*)calloc( 2, sizeof(int) );

    arr1[0] = 1;
    arr2[0] = 11;

    std::cout << "arr1, before func(): " << &arr1 << std::endl;
    std::cout << "arr2, before func(): " << &arr2 << std::endl;

    func(&arr1, &arr2);

    std::cout << "arr1, after func(): " << &arr1 << std::endl;
    std::cout << "arr2, after func(): " << &arr2 << std::endl;

    std::cout << "" << std::endl;

    std::cout << "arr1: " << std::endl;
    std::cout << arr1[0] << std::endl;
    std::cout << arr1[1] << std::endl;
    std::cout << arr1[2] << std::endl;

    std::cout << "" << std::endl;

    std::cout << "arr2:" << std::endl;
    std::cout << arr2[0] << std::endl;
    std::cout << arr2[1] << std::endl;
    std::cout << arr2[2] << std::endl;

    return 0;
}

输出如下:

arr1, before func(): 0xffffcc08 // Note offset after arr2 location in memory
arr2, before func(): 0xffffcc00
arr1, after func(): 0xffffcc08  // realloc did not move the arrays
arr2, after func(): 0xffffcc00

arr1:
22                              // Note line marked (*) wrote here instead of arr2[1]
2
66594

arr2:
11
0
66554

我很确定我明白为什么标有(*)的行会按照它的方式工作。我想知道是否有类似的方法直接从其地址处理arr2的[1]元素。

(道歉,如果之前有人问过这个问题,我已经阅读了不少答案,并在询问之前尽力调查。)

编辑:更好的标题,修复realloc()行中的错误

2 个答案:

答案 0 :(得分:4)

  

我想知道是否有类似的方法直接从其地址处理[1]的{​​{1}}元素。

arr2应用于[]时,您看到行为的原因是arr2_address的优先级高于[]。您可以通过应用括号来强制执行所需的优先级:

*

答案 1 :(得分:1)

你的问题是不明白什么指针指向指针到指针结构中的数据。如果您有多个指针级别,请停止并volumes

通常你几乎不应该使用指针指针。这种情况也不例外。你想通过引用传递。使用实际参考。

void func(int*& arr1, int*& arr2)
{
    arr1[0] = 42; // simple, easy
    arr1 = realloc (arr1, 42*sizeof(int)); // simple, easy
    free (arr2); // simple, easy
    arr2 = malloc (42*sizeof(int)); // simple, easy
}